Ignore:
Timestamp:
Apr 17, 2011, 10:28:36 AM (10 years ago)
Author:
Sam Hocevar
Message:

lisp: implement LispString::Create.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • abuse/trunk/src/lisp/lisp.cpp

    r486 r488  
    309309}
    310310
    311 struct LispString *new_lisp_string(char const *string)
    312 {
    313   size_t size=sizeof(LispString)+strlen(string)+1;
    314   if (size<8 + sizeof(intptr_t)) size=8 + sizeof(intptr_t);
    315 
    316   LispString *s=(LispString *)lmalloc(size, current_space);
    317   s->type=L_STRING;
    318   char *sloc=((char *)s)+sizeof(LispString);
    319   strcpy(sloc, string);
    320   return s;
    321 }
    322 
    323 struct LispString *new_lisp_string(char const *string, int length)
    324 {
    325   size_t size=sizeof(LispString)+length+1;
    326   if (size<8 + sizeof(intptr_t)) size=8 + sizeof(intptr_t);
    327   LispString *s=(LispString *)lmalloc(size, current_space);
    328   s->type=L_STRING;
    329   char *sloc=((char *)s)+sizeof(LispString);
    330   memcpy(sloc, string, length);
    331   sloc[length]=0;
    332   return s;
    333 }
    334 
    335 struct LispString *new_lisp_string(int length)
    336 {
    337   size_t size=sizeof(LispString)+length;
    338   if (size<8 + sizeof(intptr_t)) size=8 + sizeof(intptr_t);
    339   LispString *s=(LispString *)lmalloc(size, current_space);
    340   s->type=L_STRING;
    341   char *sloc=((char *)s)+sizeof(LispString);
    342   strcpy(sloc, "");
    343   return s;
     311struct LispString *LispString::Create(char const *string)
     312{
     313    size_t size = sizeof(LispString) + strlen(string);
     314    if (size < sizeof(LispRedirect))
     315        size = sizeof(LispRedirect);
     316
     317    LispString *s = (LispString *)lmalloc(size, current_space);
     318    s->type = L_STRING;
     319    strcpy(s->str, string);
     320    return s;
     321}
     322
     323struct LispString *LispString::Create(char const *string, int length)
     324{
     325    size_t size = sizeof(LispString) + length;
     326    if (size < sizeof(LispRedirect))
     327        size = sizeof(LispRedirect);
     328
     329    LispString *s = (LispString *)lmalloc(size, current_space);
     330    s->type = L_STRING;
     331    memcpy(s->str, string, length);
     332    s->str[length] = 0;
     333    return s;
     334}
     335
     336struct LispString *LispString::Create(int length)
     337{
     338    size_t size = sizeof(LispString) + length - 1;
     339    if (size < sizeof(LispRedirect))
     340        size = sizeof(LispRedirect);
     341
     342    LispString *s = (LispString *)lmalloc(size, current_space);
     343    s->type = L_STRING;
     344    s->str[0] = '\0';
     345    return s;
    344346}
    345347
     
    433435  LispSymbol *s=(LispSymbol *)lmalloc(sizeof(LispSymbol), current_space);
    434436  s->type=L_SYMBOL;
    435   s->name=new_lisp_string(name);
     437  s->name=LispString::Create(name);
    436438  s->value=l_undefined;
    437439  s->function=l_undefined;
     
    533535}
    534536
    535 char *lstring_value(void *lstring)
     537char *LispString::GetString()
    536538{
    537539#ifdef TYPE_CHECKING
    538   if (item_type(lstring)!=(ltype)L_STRING)
    539   {
    540     lprint(lstring);
    541     lbreak(" is not a string\n");
    542     exit(0);
    543   }
    544 #endif
    545   return ((char *)lstring)+sizeof(LispString);
    546 }
    547 
    548 
     540    if (item_type(this) != L_STRING)
     541    {
     542        lprint(this);
     543        lbreak(" is not a string\n");
     544        exit(0);
     545    }
     546#endif
     547    return str;
     548}
    549549
    550550void *lisp_atom(void *i)
     
    825825    while (p)
    826826    {
    827         int cmp = strcmp(name, ((char *)p->name) + sizeof(LispString));
     827        int cmp = strcmp(name, p->name->GetString());
    828828        if (cmp == 0)
    829829            return p;
     
    839839    while (p)
    840840    {
    841         int cmp = strcmp(name, ((char *)p->name) + sizeof(LispString));
     841        int cmp = strcmp(name, p->name->GetString());
    842842        if (cmp == 0)
    843843            return p;
     
    853853    p = (LispSymbol *)malloc(sizeof(LispSymbol));
    854854    p->type = L_SYMBOL;
    855     p->name = new_lisp_string(name);
     855    p->name = LispString::Create(name);
    856856
    857857    // If constant, set the value to ourself
     
    12171217  } else if (n[0]=='"')
    12181218  {
    1219     ret=new_lisp_string(str_token_len(s));
     1219    ret = LispString::Create(str_token_len(s));
    12201220    char *start=lstring_value(ret);
    12211221    for (;*s && (*s!='"' || s[1]=='"');s++, start++)
     
    13341334      break;
    13351335      case L_SYMBOL :
    1336         lprint_string((char *)(((LispSymbol *)i)->name)+sizeof(LispString));
     1336        lprint_string(((LispSymbol *)i)->name->GetString());
    13371337      break;
    13381338      case L_USER_FUNCTION :
     
    16581658  {
    16591659    int elements=list_length(el_list);       // see how many things we need to concat
    1660     if (!elements) ret=new_lisp_string("");
     1660    if (!elements) ret = LispString::Create("");
    16611661    else
    16621662    {
     
    16971697    }
    16981698      }
    1699       LispString *st=new_lisp_string(len+1);
     1699      LispString *st = LispString::Create(len+1);
    17001700      char *s=lstring_value(st);
    17011701
     
    23312331      while (dig--)
    23322332        *(tp--)='0';
    2333       ret=new_lisp_string(tp+1);
     2333      ret=LispString::Create(tp+1);
    23342334    } break;
    23352335    case SYS_FUNC_LOCAL_LOAD:
     
    27652765      char str[20];
    27662766      sprintf(str, "%ld", (long int)lnumber_value(eval(CAR(arg_list))));
    2767       ret=new_lisp_string(str);
     2767      ret=LispString::Create(str);
    27682768    } break;
    27692769    case SYS_FUNC_NCONC:
     
    28212821        lbreak("substr : bad x1 or x2 value");
    28222822
    2823       LispString *s=new_lisp_string(x2-x1+2);
     2823      LispString *s=LispString::Create(x2-x1+2);
    28242824      if (x2-x1)
    28252825        memcpy(lstring_value(s), lstring_value(st)+x1, x2-x1+1);
Note: See TracChangeset for help on using the changeset viewer.