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

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
@ -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

View file

@ -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");
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");

View file

@ -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}

View file

@ -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
{

3
read.c
View file

@ -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;
}

12
util.c
View file

@ -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;
}

2
util.h
View file

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