cirilisp/cirilisp.c

155 lines
4.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <locale.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include "internals.h"
#include "read.h"
#include "eval.h"
#include "print.h"
extern int eofStatus;
int load(char *pathname)
{
FILE *stream;
if ((stream = fopen(pathname, "r")) == NULL)
{
return 0;
}
object exp;
while (TYPE(exp = Eval(Read("", stream), globalEnv)) != EOFObject)
{
if (TYPE(exp) == errorObject)
{
Print(exp);
}
else
{
deleteObject(exp);
}
}
eofStatus = 0;
fclose(stream);
return 1;
}
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);
}
/* Омогућава библиотекама коришћеним у интерпретеру да протумаче српску
* ћирилицу */
globalEnv = createEnvironment(NULL);
addSymbolInternal("+", &addInt, 0);
addSymbolInternal("-", &subtractInt, 0);
addSymbolInternal("*", &multiplyInt, 0);
addSymbolInternal("/", &divideInt, 0);
addSymbolInternal("бројилац", &numeratorInt, 0);
addSymbolInternal("именилац", &denominatorInt, 0);
addSymbolInternal("навод", &quoteInt, 1);
addSymbolInternal("опиши", &defineInt, 1);
addSymbolInternal("опиши-складњу", &defineMacroInt, 1);
addSymbolInternal("тачно->нетачно", &exactToInexactInt, 0);
addSymbolInternal("нетачно->тачно", &inexactToExactInt, 0);
addSymbolInternal("ламбда", &lambdaInt, 1);
addSymbolInternal("<", &lessInt, 0);
addSymbolInternal(">", &greaterInt, 0);
addSymbolInternal("=", &eqNumInt, 0);
addSymbolInternal("ако", &ifInt, 1);
addSymbolInternal("нил?", &nilQInt, 0);
addSymbolInternal("конс?", &consQInt, 0);
addSymbolInternal("број?", &numberQInt, 0);
addSymbolInternal("разломак?", &fractionQInt, 0);
addSymbolInternal("реалан?", &realQInt, 0);
addSymbolInternal("симбол?", &symbolQInt, 0);
addSymbolInternal("процедура?", &procedureQInt, 0);
addSymbolInternal("булски?", &boolQInt, 0);
addSymbolInternal("ниска?", &stringQInt, 0);
addSymbolInternal("карактер?", &charQInt, 0);
addSymbolInternal("листа?", &listQInt, 0);
addSymbolInternal("надовежи", &appendInt, 0);
addSymbolInternal("конс", &consInt, 0);
addSymbolInternal("сар", &carInt, 0);
addSymbolInternal("сдр", &cdrInt, 0);
addSymbolInternal("јед?", &eqvQInt, 0);
addSymbolInternal("примени", &applyInt, 0);
addSymbolInternal("прикажи", &displayInt, 0);
addSymbolInternal("штампај", &printInt, 0);
addSymbolInternal("почни", &beginInt, 0);
addSymbolInternal("баци", &throwInt, 0);
addSymbolInternal("направи-ниску", &makeStrInt, 0);
addSymbolInternal("дужина-ниске", &strLengthInt, 0);
if (!load(DESTDIR "/usr/local/lib/cirilisp/инит.ћ"))
{
fprintf(stderr, "Није пронађена стандардна ЋИРЛИСП библиотека\
\nПрограм се није могао правилно покренути\n");
exit(3);
}
}
const char *help =
"\
Команда: cirilisp [-q|-v|-h] [<име фајла>]*\n\
Опције:\n\
-q Не започињи ЧПШП (\"Читај, процени, штампај\" петљу) након\
евалуирања командних аргумената\n\
-h Одштампај овај кратки помоћник и затвори програм\n\
-v Одштампај верзију програма и затвори програм\n\
";
int main(int argc, char **argv)
{
init();
int quitFlag = 0, opt;
while ((opt = getopt(argc, argv, "qvh")) != -1)
{
switch (opt)
{
case 'q':
quitFlag = 1;
break;
case 'v':
printf("Верзија: " VERSION "\n");
exit(0);
break;
case 'h':
printf(help);
exit(0);
break;
default:
fprintf(stderr, "Непозната командна опција");
exit(1);
}
}
while (argv[optind] != NULL)
{
if (!load(argv[optind]))
{
fprintf(stderr, "Није било могуће отворити фајл %s.\n\
Проверите да ли дати фајл заиста постоји\n", argv[optind]);
exit(2);
}
++optind;
}
if (quitFlag)
{
exit(0);
}
printf("Добродошли у ЋИРИЛИСП ЧПШП окружење, верзија: " VERSION "\n");
while (Print(Eval(Read("ШКЉ> ", stdin), globalEnv)))
;
printf("\nДостигнут крај улазног тока.\nЗбогом и дођите нам опет!\n");
return 0;
}