Додате основне функције за конструкцију ниски
This commit is contained in:
parent
816a67a770
commit
0577bf8663
|
@ -58,6 +58,7 @@ void init()
|
||||||
addSymbolInternal("ниска?", &stringQInt, 0);
|
addSymbolInternal("ниска?", &stringQInt, 0);
|
||||||
addSymbolInternal("карактер?", &charQInt, 0);
|
addSymbolInternal("карактер?", &charQInt, 0);
|
||||||
addSymbolInternal("листа?", &listQInt, 0);
|
addSymbolInternal("листа?", &listQInt, 0);
|
||||||
|
addSymbolInternal("надовежи", &appendInt, 0);
|
||||||
addSymbolInternal("конс", &consInt, 0);
|
addSymbolInternal("конс", &consInt, 0);
|
||||||
addSymbolInternal("сар", &carInt, 0);
|
addSymbolInternal("сар", &carInt, 0);
|
||||||
addSymbolInternal("сдр", &cdrInt, 0);
|
addSymbolInternal("сдр", &cdrInt, 0);
|
||||||
|
@ -66,6 +67,8 @@ void init()
|
||||||
addSymbolInternal("прикажи", &displayInt, 0);
|
addSymbolInternal("прикажи", &displayInt, 0);
|
||||||
addSymbolInternal("штампај", &printInt, 0);
|
addSymbolInternal("штампај", &printInt, 0);
|
||||||
addSymbolInternal("почни", &beginInt, 0);
|
addSymbolInternal("почни", &beginInt, 0);
|
||||||
|
addSymbolInternal("направи-ниску", &makeStrInt, 0);
|
||||||
|
addSymbolInternal("дужина-ниске", &strLengthInt, 0);
|
||||||
|
|
||||||
if (!load(DESTDIR"/usr/local/lib/cirilisp/инит.ћ"))
|
if (!load(DESTDIR"/usr/local/lib/cirilisp/инит.ћ"))
|
||||||
{
|
{
|
||||||
|
|
121
internals.c
121
internals.c
|
@ -1,10 +1,12 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "print.h"
|
#include "read.h"
|
||||||
#include "eval.h"
|
#include "eval.h"
|
||||||
|
#include "print.h"
|
||||||
|
|
||||||
int allNums(object list)
|
int allNums(object list)
|
||||||
/* проверава да ли је објекат листа чији је сваки члан број, претпоставља да је
|
/* проверава да ли је објекат листа чији је сваки члан број, претпоставља да је
|
||||||
|
@ -533,6 +535,57 @@ object listQInt(object parameters)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int validAppendArgs(object parameters)
|
||||||
|
{
|
||||||
|
int length = listLength(parameters);
|
||||||
|
if (length == 0 || length == 1)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (!properList(CAR(parameters)))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return validAppendArgs(CDR(parameters));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object appendAux(object parameters)
|
||||||
|
{
|
||||||
|
object result;
|
||||||
|
if (listLength(parameters) == 0)
|
||||||
|
{
|
||||||
|
TYPE(result) = nilObject;
|
||||||
|
}
|
||||||
|
else if (listLength(parameters) == 1)
|
||||||
|
{
|
||||||
|
result = copyObject(CAR(parameters));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
object rest = appendAux(CDR(parameters));
|
||||||
|
result = copyObject(CAR(parameters));
|
||||||
|
object *end = &result;
|
||||||
|
while (TYPE(*end) != nilObject)
|
||||||
|
{
|
||||||
|
end = &CDR(*end);
|
||||||
|
}
|
||||||
|
*end = rest;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
object appendInt(object parameters)
|
||||||
|
{
|
||||||
|
if (!validAppendArgs(parameters))
|
||||||
|
{
|
||||||
|
SIGERR(typeError);
|
||||||
|
}
|
||||||
|
return appendAux(parameters);
|
||||||
|
}
|
||||||
|
|
||||||
object consInt(object parameters)
|
object consInt(object parameters)
|
||||||
{
|
{
|
||||||
if (listLength(parameters) != 2)
|
if (listLength(parameters) != 2)
|
||||||
|
@ -704,3 +757,69 @@ object beginInt(object parameters)
|
||||||
}
|
}
|
||||||
return last;
|
return last;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object makeStrInt(object parameters)
|
||||||
|
{
|
||||||
|
object result;
|
||||||
|
if (listLength(parameters) != 2)
|
||||||
|
{
|
||||||
|
SIGERR(argumentNumberError);
|
||||||
|
}
|
||||||
|
if (TYPE(CAR(parameters)) != numberObject || !integer(CAR(parameters))
|
||||||
|
|| TYPE(CAR(CDR(parameters))) != charObject)
|
||||||
|
{
|
||||||
|
SIGERR(typeError);
|
||||||
|
}
|
||||||
|
TYPE(result) = stringObject;
|
||||||
|
if (CHR(CAR(CDR(parameters))) == L'\0')
|
||||||
|
{
|
||||||
|
STR(result) = malloc(sizeof(char));
|
||||||
|
STR(result)[0] = '\0';
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
STR(result) = malloc((MB_CUR_MAX * NUM_NUMER(CAR(parameters)) + 1) *
|
||||||
|
sizeof(char));
|
||||||
|
if (STR(result) == NULL)
|
||||||
|
{
|
||||||
|
SIGERR(outOfMemoryError);
|
||||||
|
}
|
||||||
|
int i, index;
|
||||||
|
for (i = 0, index = 0; i < NUM_NUMER(CAR(parameters)); ++i,
|
||||||
|
index += wctomb(STR(result) + index,
|
||||||
|
CHR(CAR(CDR(parameters)))))
|
||||||
|
;
|
||||||
|
STR(result)[index] = '\0';
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
object strLengthInt(object parameters)
|
||||||
|
{
|
||||||
|
object result;
|
||||||
|
if (listLength(parameters) != 1)
|
||||||
|
{
|
||||||
|
SIGERR(argumentNumberError);
|
||||||
|
}
|
||||||
|
if (TYPE(CAR(parameters)) != stringObject)
|
||||||
|
{
|
||||||
|
SIGERR(typeError);
|
||||||
|
}
|
||||||
|
TYPE(result) = numberObject;
|
||||||
|
NUM_TYPE(result) = fractionNum;
|
||||||
|
NUM_DENOM(result) = 1;
|
||||||
|
|
||||||
|
wchar_t current;
|
||||||
|
int i = 0, length = 0;
|
||||||
|
int cLength;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
cLength =
|
||||||
|
mbtowc(¤t, &STR(CAR(parameters))[i], MB_CUR_MAX);
|
||||||
|
i += cLength;
|
||||||
|
++length;
|
||||||
|
} while (current != L'\0');
|
||||||
|
length -= 1; /* одузима се дужина нул карактера */
|
||||||
|
NUM_NUMER(result) = length;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ object boolQInt(object parameters);
|
||||||
object stringQInt(object parameters);
|
object stringQInt(object parameters);
|
||||||
object charQInt(object parameters);
|
object charQInt(object parameters);
|
||||||
object listQInt(object parameters);
|
object listQInt(object parameters);
|
||||||
|
object appendInt(object parameters);
|
||||||
object consInt(object parameters);
|
object consInt(object parameters);
|
||||||
object carInt(object parameters);
|
object carInt(object parameters);
|
||||||
object cdrInt(object parameters);
|
object cdrInt(object parameters);
|
||||||
|
@ -32,3 +33,5 @@ object applyInt(object parameters, env currentEnv);
|
||||||
object displayInt(object parameters);
|
object displayInt(object parameters);
|
||||||
object printInt(object parameters);
|
object printInt(object parameters);
|
||||||
object beginInt(object parameters);
|
object beginInt(object parameters);
|
||||||
|
object makeStrInt(object parameters);
|
||||||
|
object strLengthInt(object parameters);
|
||||||
|
|
1
print.c
1
print.c
|
@ -16,6 +16,7 @@ char *errors[] =
|
||||||
"Невалидна тараба-секвенца",
|
"Невалидна тараба-секвенца",
|
||||||
"Неочекивани крај фајла",
|
"Неочекивани крај фајла",
|
||||||
"Неочекивана заграда",
|
"Неочекивана заграда",
|
||||||
|
"Недовољно меморије доступно"
|
||||||
};
|
};
|
||||||
|
|
||||||
void printValue(object input);
|
void printValue(object input);
|
||||||
|
|
9
util.c
9
util.c
|
@ -491,6 +491,15 @@ int cmp(object a, object b)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int integer(object a)
|
||||||
|
{
|
||||||
|
if (NUM_TYPE(a) != fractionNum || NUM_DENOM(a) != 1)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
object intToBool(int boolean)
|
object intToBool(int boolean)
|
||||||
{
|
{
|
||||||
object result;
|
object result;
|
||||||
|
|
4
util.h
4
util.h
|
@ -64,6 +64,7 @@ typedef enum
|
||||||
invalidHashSequenceError,
|
invalidHashSequenceError,
|
||||||
unexpectedEOFError,
|
unexpectedEOFError,
|
||||||
unmatchedParenError,
|
unmatchedParenError,
|
||||||
|
outOfMemoryError
|
||||||
} error;
|
} error;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
|
@ -197,6 +198,9 @@ object inverseNum(object a);
|
||||||
int cmp(object a, object b);
|
int cmp(object a, object b);
|
||||||
/* пореди два броја и враћа -1, 0, 1 у зависности од односа истих, претпоставља
|
/* пореди два броја и враћа -1, 0, 1 у зависности од односа истих, претпоставља
|
||||||
* да су објекти бројеви */
|
* да су објекти бројеви */
|
||||||
|
int integer(object a);
|
||||||
|
/* проверава да ли је дати број разломачки и такође цео, претпоставља да је
|
||||||
|
* дати објекат број */
|
||||||
|
|
||||||
object intToBool(int boolean);
|
object intToBool(int boolean);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue