Changeset 488


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

lisp: implement LispString::Create.

Location:
abuse/trunk/src
Files:
7 edited

Legend:

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

    r486 r488  
    725725    } break;
    726726    case 18 :
    727     { return new_lisp_string(object_names[current_object->otype]); } break;
     727    { return LispString::Create(object_names[current_object->otype]); } break;
    728728    case 19 :
    729729    { return current_object->float_tick(); } break;
     
    810810    case 26 :
    811811    {
    812       return new_lisp_string(current_level->name());
     812      return LispString::Create(current_level->name());
    813813    } break;
    814814    case 27 : return ant_ai(); break;
     
    855855      char nm[50];
    856856      last_savegame_name(nm);
    857       return new_lisp_string(nm);
     857      return LispString::Create(nm);
    858858    } break;
    859859    case 45 :
     
    863863//      get_savegame_name(nm);
    864864      the_game->reset_keymap();
    865       return new_lisp_string(nm);
     865      return LispString::Create(nm);
    866866    } break;
    867867    case 46 :
    868868    {
    869       return new_lisp_string(start_argv[lnumber_value(eval(CAR(args)))]);
     869      return LispString::Create(start_argv[lnumber_value(eval(CAR(args)))]);
    870870    } break;
    871871    case 47 :
     
    935935        lbreak("object is not a player, cannot return name");
    936936      else
    937         return new_lisp_string(c->name);
     937        return LispString::Create(c->name);
    938938    } break;
    939939    case 54 :
     
    941941      char cd[150];
    942942      getcwd(cd,100);
    943       return new_lisp_string(cd);
     943      return LispString::Create(cd);
    944944    } break;
    945945    case 55 :
     
    964964    *tp=0;
    965965      }
    966       return new_lisp_string(tmp);
     966      return LispString::Create(tmp);
    967967    } break;
    968968    case 58 :
     
    976976    p_ref r1(fl),r2(dl);
    977977   
    978     for (i=tfiles-1;i>=0;i--) { push_onto_list(new_lisp_string(files[i]),fl); free(files[i]); }
     978    for (i=tfiles-1;i>=0;i--) { push_onto_list(LispString::Create(files[i]),fl); free(files[i]); }
    979979    free(files);
    980980
    981     for (i=tdirs-1;i>=0;i--) { push_onto_list(new_lisp_string(dirs[i]),dl); free(dirs[i]); }
     981    for (i=tdirs-1;i>=0;i--) { push_onto_list(LispString::Create(dirs[i]),dl); free(dirs[i]); }
    982982    free(dirs);
    983983   
     
    10121012        {
    10131013          sprintf(name2,"%s%04ld.pcx",name,i);
    1014           push_onto_list(new_lisp_string(name2),ret);
     1014          push_onto_list(LispString::Create(name2),ret);
    10151015        }
    10161016      } else
     
    10191019        {
    10201020          sprintf(name2,"%s%04ld.pcx",name,i);
    1021           push_onto_list(new_lisp_string(name2),ret);
     1021          push_onto_list(LispString::Create(name2),ret);
    10221022        }
    10231023      }
  • abuse/trunk/src/lcache.cpp

    r486 r488  
    108108    case L_STRING :
    109109    { long l=fp->read_uint32();
    110       LispString *s=new_lisp_string(l);
     110      LispString *s = LispString::Create(l);
    111111      fp->read(lstring_value(s),l);
    112112      return s;
  • abuse/trunk/src/level.cpp

    r484 r488  
    15101510    void *arg_list=NULL;
    15111511    p_ref r1(arg_list);
    1512     push_onto_list(new_lisp_string(n),arg_list);
     1512    push_onto_list(LispString::Create(n),arg_list);
    15131513    eval_function((LispSymbol *)l_level_loaded,arg_list);
    15141514
  • 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);
  • abuse/trunk/src/lisp/lisp.h

    r486 r488  
    7575struct LispString : LispObject
    7676{
     77    static LispString *Create(char const *string);
     78    static LispString *Create(char const *string, int length);
     79    static LispString *Create(int length);
     80
     81    char *GetString();
     82
     83    char str[1];
    7784};
    7885
     
    153160void *lpointer_value(void *lpointer);
    154161int32_t lnumber_value(void *lnumber);
    155 char *lstring_value(void *lstring);
    156162unsigned short lcharacter_value(void *c);
    157163long lfixed_point_value(void *c);
     
    184190LispPointer *new_lisp_pointer(void *addr);
    185191LispChar *new_lisp_character(uint16_t ch);
    186 LispString *new_lisp_string(char const *string);
    187 LispString *new_lisp_string(char const *string, int length);
    188 LispString *new_lisp_string(int length);
    189192LispFixedPoint *new_lisp_fixed_point(int32_t x);
    190193LispObjectVar *new_lisp_object_var(int16_t number);
     
    230233// FIXME: get rid of this later
    231234static inline void *symbol_value(void *sym) { return ((LispSymbol *)sym)->GetValue(); }
    232 
    233 
    234 
    235 #endif
     235static inline char *lstring_value(void *str) { return ((LispString *)str)->GetString(); }
     236
     237
     238
     239#endif
  • abuse/trunk/src/lisp/lisp_gc.cpp

    r486 r488  
    156156        break;
    157157      case L_STRING:
    158         ret = new_lisp_string(lstring_value(x));
     158        ret = LispString::Create(lstring_value(x));
    159159        break;
    160160      case L_CHARACTER:
  • abuse/trunk/src/view.cpp

    r484 r488  
    460460      void *m=mark_heap(TMP_SPACE);
    461461      void *list=NULL;
    462       push_onto_list(new_lisp_string(chat_buf),list);
     462      push_onto_list(LispString::Create(chat_buf),list);
    463463      eval_function((LispSymbol *)l_chat_input,list);
    464464      restore_heap(m,TMP_SPACE);
Note: See TracChangeset for help on using the changeset viewer.