From ff4e73a6246372878a4de4d0b9652a27d5df94dd Mon Sep 17 00:00:00 2001 From: kappa Date: Sat, 23 Mar 2019 14:10:16 +0100 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B2=D0=B0=20=D0=BF=D0=BE=D0=B7=D0=BD?= =?UTF-8?q?=D0=B0=D1=82=D0=B0=20=D0=BF=D1=80=D0=BE=D1=86=D1=83=D1=80=D0=B5?= =?UTF-8?q?=D1=9A=D0=B0=20=D0=BC=D0=B5=D0=BC=D0=BE=D1=80=D0=B8=D1=98=D0=B5?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=BF=D1=83=D1=88=D0=B5=D0=BD=D0=B0,=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D1=99=D0=B5=D0=BD=20=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D1=83=D1=80=D1=81=D0=BA=D0=B8=20=D1=80=D0=B0=D0=B4,=20?= =?UTF-8?q?=D0=B5=D0=BD=D0=BA=D0=BE=D0=B4=D0=B8=D1=80=D0=B0=D1=9A=D0=B5=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=B2=D0=BE=D1=80=D0=BD=D0=BE=D0=B3=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0=20=D1=83=D1=87=D0=B8=D1=9A=D0=B5=D0=BD=D0=BE=20?= =?UTF-8?q?=D0=B8=D0=B7=D1=80=D0=B8=D1=87=D0=B8=D1=82=D0=B8=D0=BC=20=D0=B7?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D1=98=D0=BB=D0=B5=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 6 +++--- cirilisp.c | 33 ++++++++++++++++++++++++++------- doc/rad.tex | 4 ++-- internals.c | 2 ++ read.c | 3 +++ util.c | 12 ++++++++---- util.h | 2 -- 7 files changed, 44 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index e0f92d0..d07873c 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# cirilisp - компајлер за ћирилични дијалекат лиспа +# cirilisp - интерпретер за ћирилични дијалекат лиспа # ћирилисп верзија VERSION = 0,9 @@ -9,8 +9,8 @@ LIBPREFIX = $(PREFIX)/lib # флегови за C компајлер и линкер CPPFLAGS = -D_POSIX_C_SOURCE=2 -DDESTDIR=\"$(DESTDIR)\" -DVERSION=\"$(VERSION)\" -# CFLAGS = -g -std=c99 -pedantic -Wall -O0 -CFLAGS = -std=c99 -pedantic -Wall -O3 +CFLAGS = -g -std=c99 -pedantic -Wall -Wextra -O0 -fexec-charset=UTF-8 -finput-charset=UTF-8 -fwide-exec-charset=UTF-32LE +# CFLAGS = -std=c99 -pedantic -Wall -Wextra -O3 -fexec-charset=UTF-8 -finput-charset=UTF-8 -fwide-exec-charset=UTF-32LE LDFLAGS = -lm -lc CC = cc diff --git a/cirilisp.c b/cirilisp.c index 8be0d45..9e7eb8c 100644 --- a/cirilisp.c +++ b/cirilisp.c @@ -8,6 +8,8 @@ #include "eval.h" #include "print.h" +extern env globalEnv; + extern int eofStatus; int load(char *pathname) { @@ -33,13 +35,30 @@ int load(char *pathname) return 1; } +void exitCirilisp(int exitStatus) +/* терминира програм са жељеним излазним статусом, притом брише глобално + * окружење које једино и може бити активно током изласка из програма, и + * брише још неке динамички алоциране предмете у меморији */ +{ + if (globalEnv != NULL) + { + removeEnvironment(globalEnv); + } + extern wchar_t *globalBuffer; + if (globalBuffer != NULL) + { + free(globalBuffer); + } + exit(exitStatus); +} + void init() { if (setlocale(LC_ALL, "sr_RS.utf8") == NULL) { fprintf(stderr, "lokal programa se nije mogao podesiti na\ \"sr_RS.utf8\", proverite da li ste ga osposobili na vasem sistemu\n"); - exit(0); + exitCirilisp(0); } /* Омогућава библиотекама коришћеним у интерпретеру да протумаче српску * ћирилицу */ @@ -92,7 +111,7 @@ void init() { fprintf(stderr, "Није пронађена стандардна ЋИРЛИСП библиотека\ \nПрограм се није могао правилно покренути\n"); - exit(3); + exitCirilisp(3); } } @@ -120,15 +139,15 @@ int main(int argc, char **argv) break; case 'v': printf("Верзија: " VERSION "\n"); - exit(0); + exitCirilisp(0); break; case 'h': printf(help); - exit(0); + exitCirilisp(0); break; default: fprintf(stderr, "Непозната командна опција"); - exit(1); + exitCirilisp(1); } } @@ -138,14 +157,14 @@ int main(int argc, char **argv) { fprintf(stderr, "Није било могуће отворити фајл %s.\n\ Проверите да ли дати фајл заиста постоји\n", argv[optind]); - exit(2); + exitCirilisp(2); } ++optind; } if (quitFlag) { - exit(0); + exitCirilisp(0); } printf("Добродошли у ЋИРИЛИСП ЧПШП окружење, верзија: " VERSION "\n"); diff --git a/doc/rad.tex b/doc/rad.tex index 79458d5..d0eb971 100644 --- a/doc/rad.tex +++ b/doc/rad.tex @@ -1278,11 +1278,11 @@ int main(int argc, char **argv) \newpage \section*{Биографија матуранта} \addcontentsline{toc}{section}{\protect\numberline{}Биографија Матуранта} -Ја сам Петар Каприш, ученик гимназије ,,Јован Јовановић Змај'', рођен 11. јула 2019. +Ја сам Петар Каприш, ученик гимназије ,,Јован Јовановић Змај'', рођен 11. јула 2000. \begin{wrapfigure}{r}{0.5\textwidth} \begin{center} - \includegraphics[width=0.5\linewidth]{../../IBI_7206.JPG} + \includegraphics[width=0.5\linewidth]{../../MMM_5394.jpg} \end{center} \caption{Моја слика} \end{wrapfigure} diff --git a/internals.c b/internals.c index fb74b3e..e440e78 100644 --- a/internals.c +++ b/internals.c @@ -358,6 +358,7 @@ object defineInt(object parameters, env currentEnv) currentEnv); addSymbolVariable(SYM(result), proc, currentEnv); + deleteObject(proc); } else { @@ -400,6 +401,7 @@ object defineMacroInt(object parameters, env currentEnv) object proc = lambdaInt(parameters, currentEnv); PROC_SPECIAL(proc) = 1; addSymbolVariable(SYM(result), proc, currentEnv); + deleteObject(proc); } else { diff --git a/read.c b/read.c index 13ba1b0..6cbb567 100644 --- a/read.c +++ b/read.c @@ -244,6 +244,7 @@ object getToken(FILE *stream) SYM(result) = malloc((strlen(s) + 1) * sizeof(char)); strcpy(SYM(result), s); } + free(s); return result; } @@ -365,6 +366,7 @@ object dispatchedChar(wint_t c, FILE *stream) break; case WEOF: SIGERR(unexpectedEOFError); + break; default: SIGERR(invalidHashSequenceError); break; @@ -392,6 +394,7 @@ object macroFunction(wchar_t m, FILE *stream) !strcmp(ERR(currentObject), commonErrs[unmatchedParenError])) { + deleteObject(currentObject); TYPE(*listCurrent) = nilObject; break; } diff --git a/util.c b/util.c index d4b0e98..f397e8d 100644 --- a/util.c +++ b/util.c @@ -5,6 +5,8 @@ #include "util.h" +env globalEnv = NULL; + char *commonErrs[] = { "Конс објекат мора бити правилна листа да би могао бити евалуиран", @@ -192,11 +194,13 @@ void deleteObject(object input) free(ERR(input)); ERR(input) = NULL; } - else if (TYPE(input) == procedureObject && - PROC_TYPE(input) == compoundProc) + else if (TYPE(input) == procedureObject) { - deleteObject(PROC_COMP_ARGS(input)); - deleteObject(PROC_COMP_BODY(input)); + if (PROC_TYPE(input) == compoundProc) + { + deleteObject(PROC_COMP_ARGS(input)); + deleteObject(PROC_COMP_BODY(input)); + } free(PROC(input)); PROC(input) = NULL; } diff --git a/util.h b/util.h index ecb4627..0f81cbb 100644 --- a/util.h +++ b/util.h @@ -171,8 +171,6 @@ struct procedure } value; }; -env globalEnv; - /******************************* функције везане за окружења */ env createEnvironment(env enclosing); void removeEnvironment(env input);