Сва позната процурења меморије запушена, поправљен матурски рад, енкодирање изворног кода учињено изричитим за компајлер

This commit is contained in:
kappa 2019-03-23 14:10:16 +01:00
parent bea145baec
commit ff4e73a624
7 changed files with 44 additions and 18 deletions

View file

@ -1,4 +1,4 @@
# cirilisp - компајлер за ћирилични дијалекат лиспа # cirilisp - интерпретер за ћирилични дијалекат лиспа
# ћирилисп верзија # ћирилисп верзија
VERSION = 0,9 VERSION = 0,9
@ -9,8 +9,8 @@ LIBPREFIX = $(PREFIX)/lib
# флегови за C компајлер и линкер # флегови за C компајлер и линкер
CPPFLAGS = -D_POSIX_C_SOURCE=2 -DDESTDIR=\"$(DESTDIR)\" -DVERSION=\"$(VERSION)\" CPPFLAGS = -D_POSIX_C_SOURCE=2 -DDESTDIR=\"$(DESTDIR)\" -DVERSION=\"$(VERSION)\"
# CFLAGS = -g -std=c99 -pedantic -Wall -O0 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 -O3 # CFLAGS = -std=c99 -pedantic -Wall -Wextra -O3 -fexec-charset=UTF-8 -finput-charset=UTF-8 -fwide-exec-charset=UTF-32LE
LDFLAGS = -lm -lc LDFLAGS = -lm -lc
CC = cc CC = cc

View file

@ -8,6 +8,8 @@
#include "eval.h" #include "eval.h"
#include "print.h" #include "print.h"
extern env globalEnv;
extern int eofStatus; extern int eofStatus;
int load(char *pathname) int load(char *pathname)
{ {
@ -33,13 +35,30 @@ int load(char *pathname)
return 1; return 1;
} }
void exitCirilisp(int exitStatus)
/* терминира програм са жељеним излазним статусом, притом брише глобално
* окружење које једино и може бити активно током изласка из програма, и
* брише још неке динамички алоциране предмете у меморији */
{
if (globalEnv != NULL)
{
removeEnvironment(globalEnv);
}
extern wchar_t *globalBuffer;
if (globalBuffer != NULL)
{
free(globalBuffer);
}
exit(exitStatus);
}
void init() void init()
{ {
if (setlocale(LC_ALL, "sr_RS.utf8") == NULL) if (setlocale(LC_ALL, "sr_RS.utf8") == NULL)
{ {
fprintf(stderr, "lokal programa se nije mogao podesiti na\ fprintf(stderr, "lokal programa se nije mogao podesiti na\
\"sr_RS.utf8\", proverite da li ste ga osposobili na vasem sistemu\n"); \"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, "Није пронађена стандардна ЋИРЛИСП библиотека\ fprintf(stderr, "Није пронађена стандардна ЋИРЛИСП библиотека\
\рограм се није могао правилно покренути\n"); \рограм се није могао правилно покренути\n");
exit(3); exitCirilisp(3);
} }
} }
@ -120,15 +139,15 @@ int main(int argc, char **argv)
break; break;
case 'v': case 'v':
printf("Верзија: " VERSION "\n"); printf("Верзија: " VERSION "\n");
exit(0); exitCirilisp(0);
break; break;
case 'h': case 'h':
printf(help); printf(help);
exit(0); exitCirilisp(0);
break; break;
default: default:
fprintf(stderr, "Непозната командна опција"); fprintf(stderr, "Непозната командна опција");
exit(1); exitCirilisp(1);
} }
} }
@ -138,14 +157,14 @@ int main(int argc, char **argv)
{ {
fprintf(stderr, "Није било могуће отворити фајл %s.\n\ fprintf(stderr, "Није било могуће отворити фајл %s.\n\
Проверите да ли дати фајл заиста постоји\n", argv[optind]); Проверите да ли дати фајл заиста постоји\n", argv[optind]);
exit(2); exitCirilisp(2);
} }
++optind; ++optind;
} }
if (quitFlag) if (quitFlag)
{ {
exit(0); exitCirilisp(0);
} }
printf("Добродошли у ЋИРИЛИСП ЧПШП окружење, верзија: " VERSION "\n"); printf("Добродошли у ЋИРИЛИСП ЧПШП окружење, верзија: " VERSION "\n");

View file

@ -1278,11 +1278,11 @@ int main(int argc, char **argv)
\newpage \newpage
\section*{Биографија матуранта} \section*{Биографија матуранта}
\addcontentsline{toc}{section}{\protect\numberline{}Биографија Матуранта} \addcontentsline{toc}{section}{\protect\numberline{}Биографија Матуранта}
Ја сам Петар Каприш, ученик гимназије ,,Јован Јовановић Змај'', рођен 11. јула 2019. Ја сам Петар Каприш, ученик гимназије ,,Јован Јовановић Змај'', рођен 11. јула 2000.
\begin{wrapfigure}{r}{0.5\textwidth} \begin{wrapfigure}{r}{0.5\textwidth}
\begin{center} \begin{center}
\includegraphics[width=0.5\linewidth]{../../IBI_7206.JPG} \includegraphics[width=0.5\linewidth]{../../MMM_5394.jpg}
\end{center} \end{center}
\caption{Моја слика} \caption{Моја слика}
\end{wrapfigure} \end{wrapfigure}

View file

@ -358,6 +358,7 @@ object defineInt(object parameters, env currentEnv)
currentEnv); currentEnv);
addSymbolVariable(SYM(result), proc, addSymbolVariable(SYM(result), proc,
currentEnv); currentEnv);
deleteObject(proc);
} }
else else
{ {
@ -400,6 +401,7 @@ object defineMacroInt(object parameters, env currentEnv)
object proc = lambdaInt(parameters, currentEnv); object proc = lambdaInt(parameters, currentEnv);
PROC_SPECIAL(proc) = 1; PROC_SPECIAL(proc) = 1;
addSymbolVariable(SYM(result), proc, currentEnv); addSymbolVariable(SYM(result), proc, currentEnv);
deleteObject(proc);
} }
else else
{ {

3
read.c
View file

@ -244,6 +244,7 @@ object getToken(FILE *stream)
SYM(result) = malloc((strlen(s) + 1) * sizeof(char)); SYM(result) = malloc((strlen(s) + 1) * sizeof(char));
strcpy(SYM(result), s); strcpy(SYM(result), s);
} }
free(s);
return result; return result;
} }
@ -365,6 +366,7 @@ object dispatchedChar(wint_t c, FILE *stream)
break; break;
case WEOF: case WEOF:
SIGERR(unexpectedEOFError); SIGERR(unexpectedEOFError);
break;
default: default:
SIGERR(invalidHashSequenceError); SIGERR(invalidHashSequenceError);
break; break;
@ -392,6 +394,7 @@ object macroFunction(wchar_t m, FILE *stream)
!strcmp(ERR(currentObject), !strcmp(ERR(currentObject),
commonErrs[unmatchedParenError])) commonErrs[unmatchedParenError]))
{ {
deleteObject(currentObject);
TYPE(*listCurrent) = nilObject; TYPE(*listCurrent) = nilObject;
break; break;
} }

8
util.c
View file

@ -5,6 +5,8 @@
#include "util.h" #include "util.h"
env globalEnv = NULL;
char *commonErrs[] = char *commonErrs[] =
{ {
"Конс објекат мора бити правилна листа да би могао бити евалуиран", "Конс објекат мора бити правилна листа да би могао бити евалуиран",
@ -192,11 +194,13 @@ void deleteObject(object input)
free(ERR(input)); free(ERR(input));
ERR(input) = NULL; ERR(input) = NULL;
} }
else if (TYPE(input) == procedureObject && else if (TYPE(input) == procedureObject)
PROC_TYPE(input) == compoundProc) {
if (PROC_TYPE(input) == compoundProc)
{ {
deleteObject(PROC_COMP_ARGS(input)); deleteObject(PROC_COMP_ARGS(input));
deleteObject(PROC_COMP_BODY(input)); deleteObject(PROC_COMP_BODY(input));
}
free(PROC(input)); free(PROC(input));
PROC(input) = NULL; PROC(input) = NULL;
} }

2
util.h
View file

@ -171,8 +171,6 @@ struct procedure
} value; } value;
}; };
env globalEnv;
/******************************* функције везане за окружења */ /******************************* функције везане за окружења */
env createEnvironment(env enclosing); env createEnvironment(env enclosing);
void removeEnvironment(env input); void removeEnvironment(env input);