Промењен систем прераде краја фајла

This commit is contained in:
kappa 2019-02-09 19:55:51 +01:00
parent e8705cec39
commit 577c19940e
6 changed files with 80 additions and 27 deletions

View file

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

View file

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

View file

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

View file

@ -1,3 +1,3 @@
#pragma once #pragma once
void print(object input); int print(object input);

81
read.c
View file

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

3
util.h
View file

@ -46,7 +46,8 @@ typedef enum
boolObject, boolObject,
stringObject, stringObject,
charObject, charObject,
errorObject errorObject,
EOFObject
} dataType; } dataType;
typedef enum typedef enum