Bläddra i källkod

Fix String factory

pull/21/head
mtardy 4 år sedan
förälder
incheckning
e7b990fa47
2 ändrade filer med 44 tillägg och 3 borttagningar
  1. +11
    -1
      object.c
  2. +33
    -2
      parse.leg

+ 11
- 1
object.c Visa fil

@ -249,13 +249,23 @@ oop makeString(char *value)
// value will be used directly // value will be used directly
oop makeStringFrom(char *value, size_t l) oop makeStringFrom(char *value, size_t l)
{ {
oop newString = memcheck(malloc(sizeof(union object)));
oop newString = malloc(sizeof(union object));
newString->type = String; newString->type = String;
newString->String.value = value; newString->String.value = value;
newString->String.size = l; newString->String.size = l;
return newString; return newString;
} }
oop makeStringFromChar(char c, int repeat)
{
char *str= malloc(sizeof(char) * (repeat + 1));
for (int i=0; i<repeat; ++i) {
str[i]= c;
}
str[repeat]= '\0';
return makeStringFrom(str, repeat);
}
size_t string_size(oop s) size_t string_size(oop s)
{ {
return get(s, String, size); return get(s, String, size);

+ 33
- 2
parse.leg Visa fil

@ -1948,8 +1948,39 @@ oop prim_import(oop scope, oop params)
oop prim_String(oop scope, oop params) oop prim_String(oop scope, oop params)
{ {
if (!map_hasIntegerKey(params, 0)) return null;
return makeString(printString(get(params, Map, elements)[0].value));
if (!map_hasIntegerKey(params, 0)) return makeString("");
oop arg= get(params, Map, elements)[0].value;
switch (getType(arg)) {
case Undefined: {
return makeString("");
}
case Integer: {
int repeat= getInteger(arg);
if (!map_hasIntegerKey(params, 1)) {
// I put 0 otherwise '\0' won't be printed and can't be seen
return makeStringFromChar('0', repeat);
}
char c= getInteger(get(params, Map, elements)[1].value);
return makeStringFromChar(c, repeat);
}
case String: {
return clone(arg);
}
case Map: {
if (map_isArray(arg)) {
size_t len= map_size(arg);
char *str= malloc(sizeof(char) * len + 1);
for (size_t i=0; i < len; ++i) {
str[i]= getInteger(get(arg, Map, elements)[i].value);
}
return makeStringFrom(str, len);
}
}
case Symbol: {
return makeString(get(arg, Symbol, name));
}
}
return null;
} }
oop prim_Integer(oop scope, oop params) oop prim_Integer(oop scope, oop params)

Laddar…
Avbryt
Spara