Промењен систем прераде краја фајла
This commit is contained in:
parent
e8705cec39
commit
577c19940e
4
Makefile
4
Makefile
|
@ -8,8 +8,8 @@ PREFIX = /usr/local
|
||||||
|
|
||||||
# флегови за C компајлер и линкер
|
# флегови за C компајлер и линкер
|
||||||
CPPFLAGS = -D_POSIX_C_SOURCE=200200L
|
CPPFLAGS = -D_POSIX_C_SOURCE=200200L
|
||||||
# CFLAGS = -g -std=c99 -pedantic -Wall -O0
|
CFLAGS = -g -std=c99 -pedantic -Wall -O0
|
||||||
CFLAGS = -std=c99 -pedantic -Wall -O3
|
# CFLAGS = -std=c99 -pedantic -Wall -O3
|
||||||
LDFLAGS = -lm -lc
|
LDFLAGS = -lm -lc
|
||||||
|
|
||||||
CC = cc
|
CC = cc
|
||||||
|
|
10
cirilisp.c
10
cirilisp.c
|
@ -1,3 +1,5 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
#include "read.h"
|
#include "read.h"
|
||||||
#include "eval.h"
|
#include "eval.h"
|
||||||
|
@ -6,8 +8,8 @@
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
for (;;)
|
while (print(eval(read("ШКЉ> "), globalEnv)));
|
||||||
{
|
printf("\nДостигнут крај стрима.\nЗбогом и дођите нам опет!\n");
|
||||||
print(eval(read("ШКЉ> "), globalEnv));
|
|
||||||
}
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
7
print.c
7
print.c
|
@ -20,18 +20,23 @@ char *errors[] =
|
||||||
|
|
||||||
void printValue(object input);
|
void printValue(object input);
|
||||||
|
|
||||||
void print(object input)
|
int print(object input)
|
||||||
{
|
{
|
||||||
if (TYPE(input) == errorObject)
|
if (TYPE(input) == errorObject)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "\nГРЕШКА: %s\n\n", errors[ERR(input)]);
|
fprintf(stderr, "\nГРЕШКА: %s\n\n", errors[ERR(input)]);
|
||||||
}
|
}
|
||||||
|
else if (TYPE(input) == EOFObject)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
else if (TYPE(input) != unspecifiedObject)
|
else if (TYPE(input) != unspecifiedObject)
|
||||||
{
|
{
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printValue(input);
|
printValue(input);
|
||||||
printf("\n\n");
|
printf("\n\n");
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void printValue(object input)
|
void printValue(object input)
|
||||||
|
|
2
print.h
2
print.h
|
@ -1,3 +1,3 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
void print(object input);
|
int print(object input);
|
||||||
|
|
81
read.c
81
read.c
|
@ -14,8 +14,8 @@ int isConstituent(wchar_t c);
|
||||||
int isMacroC(wchar_t c);
|
int isMacroC(wchar_t c);
|
||||||
int isEscape(wchar_t c);
|
int isEscape(wchar_t c);
|
||||||
|
|
||||||
wchar_t scanwc(FILE *stream);
|
wint_t scanwc(FILE *stream);
|
||||||
#define unscanwc(c,stream) ungetwc(c,stream);
|
wint_t unscanwc(wint_t c, FILE *stream);
|
||||||
object getToken();
|
object getToken();
|
||||||
object macroFunction(wchar_t m);
|
object macroFunction(wchar_t m);
|
||||||
|
|
||||||
|
@ -28,7 +28,11 @@ object read(char *prompt)
|
||||||
|
|
||||||
while (iswspace(c = scanwc(stdin)))
|
while (iswspace(c = scanwc(stdin)))
|
||||||
;
|
;
|
||||||
if (isMacroC(c))
|
if (c == WEOF)
|
||||||
|
{
|
||||||
|
TYPE(result) = EOFObject;
|
||||||
|
}
|
||||||
|
else if (isMacroC(c))
|
||||||
{
|
{
|
||||||
result = macroFunction(c);
|
result = macroFunction(c);
|
||||||
}
|
}
|
||||||
|
@ -103,21 +107,37 @@ wchar_t *increaseBuffer()
|
||||||
return realloc(globalBuffer, bufferSize);
|
return realloc(globalBuffer, bufferSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar_t scanwc(FILE *stream)
|
int eofStatus = 0;
|
||||||
|
wint_t scanwc(FILE *stream)
|
||||||
{
|
{
|
||||||
wint_t c;
|
if (eofStatus)
|
||||||
|
|
||||||
if ((c = fgetwc(stream)) == WEOF)
|
|
||||||
{
|
{
|
||||||
printf("\nКрај улазног стрима.\nВоЗдра и дођите нам опет!\n");
|
return WEOF;
|
||||||
exit(0);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
wint_t c = getwc(stream);
|
||||||
|
if (c == WEOF)
|
||||||
|
{
|
||||||
|
eofStatus = 1;
|
||||||
|
}
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wint_t unscanwc(wint_t c, FILE *stream)
|
||||||
|
{
|
||||||
|
if (c == WEOF)
|
||||||
|
{
|
||||||
|
eofStatus = 1;
|
||||||
|
return WEOF;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return ungetwc(c, stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int lengthDigitArray(char *s)
|
int lengthDigitArray(char *s)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -136,7 +156,7 @@ object getToken()
|
||||||
buffer[0] = towlower(c);
|
buffer[0] = towlower(c);
|
||||||
if (isEscape(c))
|
if (isEscape(c))
|
||||||
{
|
{
|
||||||
while (!isEscape(c = scanwc(stdin)))
|
while ((c = scanwc(stdin)) != WEOF && !isEscape(c))
|
||||||
{
|
{
|
||||||
if (i + 2 >= bufferSize)
|
if (i + 2 >= bufferSize)
|
||||||
{
|
{
|
||||||
|
@ -147,6 +167,10 @@ object getToken()
|
||||||
|
|
||||||
buffer[++i] = c;
|
buffer[++i] = c;
|
||||||
buffer[++i] = L'\0';
|
buffer[++i] = L'\0';
|
||||||
|
if (c == WEOF)
|
||||||
|
{
|
||||||
|
SIGERR(unexpectedEOFError);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -224,7 +248,7 @@ wchar_t escapedWChar(wchar_t c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object dispatchedChar(wchar_t c)
|
object dispatchedChar(wint_t c)
|
||||||
{
|
{
|
||||||
object result;
|
object result;
|
||||||
|
|
||||||
|
@ -237,6 +261,10 @@ object dispatchedChar(wchar_t c)
|
||||||
int i = 0, n;
|
int i = 0, n;
|
||||||
|
|
||||||
c = scanwc(stdin);
|
c = scanwc(stdin);
|
||||||
|
if (c == WEOF)
|
||||||
|
{
|
||||||
|
SIGERR(unexpectedEOFError);
|
||||||
|
}
|
||||||
if (!isConstituent(c))
|
if (!isConstituent(c))
|
||||||
{
|
{
|
||||||
CHR(result) = c;
|
CHR(result) = c;
|
||||||
|
@ -244,7 +272,7 @@ object dispatchedChar(wchar_t c)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
unscanwc(c, stdin);
|
unscanwc(c, stdin);
|
||||||
while (!iswspace(c = scanwc(stdin)))
|
while ((c = scanwc(stdin)) != WEOF && !iswspace(c))
|
||||||
{
|
{
|
||||||
if (i + 1 >= bufferSize)
|
if (i + 1 >= bufferSize)
|
||||||
{
|
{
|
||||||
|
@ -289,14 +317,16 @@ object dispatchedChar(wchar_t c)
|
||||||
case L'|':
|
case L'|':
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
if ((c = scanwc(stdin)) == L'|' &&
|
if (((c = scanwc(stdin)) == L'|' &&
|
||||||
(c = scanwc(stdin)) == L'#')
|
(c = scanwc(stdin)) == L'#') || c == WEOF)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TYPE(result) = unspecifiedObject;
|
TYPE(result) = unspecifiedObject;
|
||||||
break;
|
break;
|
||||||
|
case WEOF:
|
||||||
|
SIGERR(unexpectedEOFError);
|
||||||
default:
|
default:
|
||||||
SIGERR(invalidHashSequenceError);
|
SIGERR(invalidHashSequenceError);
|
||||||
break;
|
break;
|
||||||
|
@ -311,6 +341,7 @@ object macroFunction(wchar_t m)
|
||||||
object *listCurrent;
|
object *listCurrent;
|
||||||
object expression;
|
object expression;
|
||||||
wchar_t *buffer;
|
wchar_t *buffer;
|
||||||
|
wint_t c;
|
||||||
|
|
||||||
switch (m)
|
switch (m)
|
||||||
{
|
{
|
||||||
|
@ -325,6 +356,13 @@ object macroFunction(wchar_t m)
|
||||||
TYPE(*listCurrent) = nilObject;
|
TYPE(*listCurrent) = nilObject;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
else if (TYPE(currentObject) == EOFObject)
|
||||||
|
{
|
||||||
|
TYPE(*listCurrent) = nilObject;
|
||||||
|
deleteObject(result);
|
||||||
|
SIGERR(unexpectedEOFError);
|
||||||
|
break;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TYPE(*listCurrent) = consObject;
|
TYPE(*listCurrent) = consObject;
|
||||||
|
@ -403,7 +441,11 @@ object macroFunction(wchar_t m)
|
||||||
expression = read("");
|
expression = read("");
|
||||||
if (TYPE(expression) == errorObject)
|
if (TYPE(expression) == errorObject)
|
||||||
{
|
{
|
||||||
return expression;
|
SIGERR(ERR(expression));
|
||||||
|
}
|
||||||
|
else if (TYPE(expression) == EOFObject)
|
||||||
|
{
|
||||||
|
SIGERR(unexpectedEOFError);
|
||||||
}
|
}
|
||||||
|
|
||||||
TYPE(result) = consObject;
|
TYPE(result) = consObject;
|
||||||
|
@ -421,15 +463,14 @@ object macroFunction(wchar_t m)
|
||||||
break;
|
break;
|
||||||
case L';':
|
case L';':
|
||||||
TYPE(result) = unspecifiedObject;
|
TYPE(result) = unspecifiedObject;
|
||||||
while (scanwc(stdin) != L'\n')
|
while ((c = scanwc(stdin)) != L'\n' && c != WEOF)
|
||||||
;
|
;
|
||||||
break;
|
break;
|
||||||
case L'"':
|
case L'"':
|
||||||
buffer = getBuffer();
|
buffer = getBuffer();
|
||||||
wchar_t c;
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
while ((c = scanwc(stdin)) != L'"')
|
while ((c = scanwc(stdin)) != L'"' && c != WEOF)
|
||||||
{
|
{
|
||||||
if (i + 2 >= bufferSize)
|
if (i + 2 >= bufferSize)
|
||||||
{
|
{
|
||||||
|
@ -445,6 +486,10 @@ object macroFunction(wchar_t m)
|
||||||
buffer[i++] = c;
|
buffer[i++] = c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (c == WEOF)
|
||||||
|
{
|
||||||
|
SIGERR(unexpectedEOFError);
|
||||||
|
}
|
||||||
buffer[i] = L'\0';
|
buffer[i] = L'\0';
|
||||||
|
|
||||||
int n = wcstombs(NULL, buffer, 0) + 1;
|
int n = wcstombs(NULL, buffer, 0) + 1;
|
||||||
|
|
Loading…
Reference in a new issue