Додате основне функције за конструкцију ниски
This commit is contained in:
parent
816a67a770
commit
0577bf8663
|
@ -58,6 +58,7 @@ void init()
|
|||
addSymbolInternal("ниска?", &stringQInt, 0);
|
||||
addSymbolInternal("карактер?", &charQInt, 0);
|
||||
addSymbolInternal("листа?", &listQInt, 0);
|
||||
addSymbolInternal("надовежи", &appendInt, 0);
|
||||
addSymbolInternal("конс", &consInt, 0);
|
||||
addSymbolInternal("сар", &carInt, 0);
|
||||
addSymbolInternal("сдр", &cdrInt, 0);
|
||||
|
@ -66,6 +67,8 @@ void init()
|
|||
addSymbolInternal("прикажи", &displayInt, 0);
|
||||
addSymbolInternal("штампај", &printInt, 0);
|
||||
addSymbolInternal("почни", &beginInt, 0);
|
||||
addSymbolInternal("направи-ниску", &makeStrInt, 0);
|
||||
addSymbolInternal("дужина-ниске", &strLengthInt, 0);
|
||||
|
||||
if (!load(DESTDIR"/usr/local/lib/cirilisp/инит.ћ"))
|
||||
{
|
||||
|
|
121
internals.c
121
internals.c
|
@ -1,10 +1,12 @@
|
|||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <wchar.h>
|
||||
|
||||
#include "util.h"
|
||||
#include "print.h"
|
||||
#include "read.h"
|
||||
#include "eval.h"
|
||||
#include "print.h"
|
||||
|
||||
int allNums(object list)
|
||||
/* проверава да ли је објекат листа чији је сваки члан број, претпоставља да је
|
||||
|
@ -533,6 +535,57 @@ object listQInt(object parameters)
|
|||
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)
|
||||
{
|
||||
if (listLength(parameters) != 2)
|
||||
|
@ -704,3 +757,69 @@ object beginInt(object parameters)
|
|||
}
|
||||
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 charQInt(object parameters);
|
||||
object listQInt(object parameters);
|
||||
object appendInt(object parameters);
|
||||
object consInt(object parameters);
|
||||
object carInt(object parameters);
|
||||
object cdrInt(object parameters);
|
||||
|
@ -32,3 +33,5 @@ object applyInt(object parameters, env currentEnv);
|
|||
object displayInt(object parameters);
|
||||
object printInt(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);
|
||||
|
|
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 result;
|
||||
|
|
4
util.h
4
util.h
|
@ -64,6 +64,7 @@ typedef enum
|
|||
invalidHashSequenceError,
|
||||
unexpectedEOFError,
|
||||
unmatchedParenError,
|
||||
outOfMemoryError
|
||||
} error;
|
||||
|
||||
typedef enum
|
||||
|
@ -197,6 +198,9 @@ object inverseNum(object a);
|
|||
int cmp(object a, object b);
|
||||
/* пореди два броја и враћа -1, 0, 1 у зависности од односа истих, претпоставља
|
||||
* да су објекти бројеви */
|
||||
int integer(object a);
|
||||
/* проверава да ли је дати број разломачки и такође цео, претпоставља да је
|
||||
* дати објекат број */
|
||||
|
||||
object intToBool(int boolean);
|
||||
|
||||
|
|
Loading…
Reference in a new issue