Changeset 493
- Timestamp:
- Apr 17, 2011, 3:58:41 PM (12 years ago)
- Location:
- abuse/trunk/src
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
abuse/trunk/src/ant.cpp
r492 r493 112 112 void *call_list=NULL; 113 113 PtrRef r1(call_list); 114 push_onto_list( new_lisp_pointer(b),call_list);114 push_onto_list(LPointer::Create(b),call_list); 115 115 push_onto_list(LNumber::Create(angle),call_list); 116 116 push_onto_list(LNumber::Create(firey),call_list); 117 117 push_onto_list(LNumber::Create(firex),call_list); 118 118 push_onto_list(LNumber::Create(o->aitype()),call_list); 119 push_onto_list( new_lisp_pointer(o),call_list);119 push_onto_list(LPointer::Create(o),call_list); 120 120 eval_user_fun((LSymbol *)l_fire_object,call_list); 121 121 o->set_state((character_state)S_weapon_fire); -
abuse/trunk/src/cache.cpp
r492 r493 879 879 { 880 880 delete cache_file; 881 lprint(block);881 ((LObject *)block)->Print(); 882 882 fprintf(stderr,"Unable to open lisp cache file name %s\n",lfname); 883 883 exit(0); -
abuse/trunk/src/chars.cpp
r492 r493 85 85 if (item_type(symbol)!=L_SYMBOL) 86 86 { 87 lprint(symbol);87 ((LObject *)symbol)->Print(); 88 88 lbreak("is not a symbol (in def_char)"); 89 89 exit(0); … … 97 97 if (item_type(val)!=L_NUMBER) 98 98 { 99 lprint(symbol);99 ((LObject *)symbol)->Print(); 100 100 dprintf("expecting symbol value to be a number, instead got : "); 101 lprint(val);101 ((LObject *)val)->Print(); 102 102 lbreak(""); 103 103 exit(0); … … 116 116 if (num<ts && seq[num]) 117 117 { 118 lprint(symbol);118 ((LObject *)symbol)->Print(); 119 119 lbreak("symbol has been assigned value %d, but value already in use by state %s\n" 120 120 "use a different symbol for this state\n", … … 205 205 if (DEFINEDP(s->value) && (item_type(s->value)!=L_OBJECT_VAR)) 206 206 { 207 lprint(symbol);207 ((LObject *)symbol)->Print(); 208 208 lbreak("symbol already has a value, cannot instantiate an object varible"); 209 209 exit(0); 210 210 } else if (DEFINEDP(s->value)) 211 211 { 212 int index=((LObjectVar *)s->value)-> number;212 int index=((LObjectVar *)s->value)->index; 213 213 if (index<tiv) 214 214 { … … 405 405 if (!isa_var_name(real)) 406 406 { 407 lprint(field);407 ((LObject *)field)->Print(); 408 408 lbreak("fields : no such var name \"%s\"\n",name); 409 409 exit(0); … … 432 432 else 433 433 { 434 lprint(lcar(field));434 ((LObject *)lcar(field))->Print(); 435 435 lbreak("Unknown field for character definition"); 436 436 exit(0); -
abuse/trunk/src/clisp.cpp
r492 r493 602 602 game_object *hit=current_object->bmove(whit,o); 603 603 if (hit) 604 return new_lisp_pointer(hit);604 return LPointer::Create(hit); 605 605 else if (whit) return NULL; 606 606 else return true_symbol; 607 607 } break; 608 608 609 case 3 : return new_lisp_pointer(current_object); break;609 case 3 : return LPointer::Create(current_object); break; 610 610 case 4 : 611 611 { if (player_list->next) 612 return new_lisp_pointer(current_level->attacker(current_object));613 else return new_lisp_pointer(player_list->focus); } break;614 case 5 : return new_lisp_pointer(current_level->find_closest(current_object->x,612 return LPointer::Create(current_level->attacker(current_object)); 613 else return LPointer::Create(player_list->focus); } break; 614 case 5 : return LPointer::Create(current_level->find_closest(current_object->x, 615 615 current_object->y, 616 616 lnumber_value(eval(CAR(args))), 617 617 current_object)); break; 618 case 6 : return new_lisp_pointer(current_level->find_xclosest(current_object->x,618 case 6 : return LPointer::Create(current_level->find_xclosest(current_object->x, 619 619 current_object->y, 620 620 lnumber_value(eval(CAR(args))), … … 625 625 long n1=lnumber_value(eval(CAR(args))); 626 626 long n2=lnumber_value(eval(CAR(CDR(args)))); 627 return new_lisp_pointer(current_level->find_xrange(current_object->x,627 return LPointer::Create(current_level->find_xrange(current_object->x, 628 628 current_object->y, 629 629 n1, … … 643 643 if (current_level) 644 644 current_level->add_object(o); 645 return new_lisp_pointer(o);645 return LPointer::Create(o); 646 646 } break; 647 647 case 22 : … … 657 657 if (current_level) 658 658 current_level->add_object_after(o,current_object); 659 return new_lisp_pointer(o);660 } break; 661 662 case 9 : return new_lisp_pointer(the_game->first_view->focus); break;659 return LPointer::Create(o); 660 } break; 661 662 case 9 : return LPointer::Create(the_game->first_view->focus); break; 663 663 case 10 : 664 664 { 665 665 view *v=((game_object *)lpointer_value(eval(CAR(args))))->controller()->next; 666 666 if (v) 667 return new_lisp_pointer(v->focus);667 return LPointer::Create(v->focus); 668 668 else return NULL; 669 669 } break; 670 670 case 11 : 671 671 { 672 return new_lisp_pointer672 return LPointer::Create 673 673 ((void *)current_object->get_object(lnumber_value(eval(CAR(args))))); 674 674 } break; 675 675 case 12 : 676 676 { 677 return new_lisp_pointer677 return LPointer::Create 678 678 ((void *)current_object->get_light(lnumber_value(eval(CAR(args))))); 679 679 } break; … … 699 699 int xs=lnumber_value(eval(CAR(args))); args=lcdr(args); 700 700 int ys=lnumber_value(eval(CAR(args))); 701 return new_lisp_pointer(add_light_source(t,x,y,r1,r2,xs,ys));701 return LPointer::Create(add_light_source(t,x,y,r1,r2,xs,ys)); 702 702 } break; 703 703 case 15 : … … 722 722 } 723 723 time_marker end; 724 return new_lisp_fixed_point((long)(end.diff_time(&start)*(1<<16)));724 return LFixedPoint::Create((long)(end.diff_time(&start)*(1<<16))); 725 725 } break; 726 726 case 18 : … … 739 739 current_object->y, 740 740 x1,y1,x2,y2,list,current_object); 741 if (find) return new_lisp_pointer(find);741 if (find) return LPointer::Create(find); 742 742 else return NULL; 743 743 } break; … … 753 753 current_object->y, 754 754 a1,a2,list,current_object); 755 if (find) return new_lisp_pointer(find);755 if (find) return LPointer::Create(find); 756 756 else return NULL; 757 757 } break; … … 928 928 return ret; 929 929 } break; 930 case 51 : return new_lisp_pointer(wm->font()); break;930 case 51 : return LPointer::Create(wm->font()); break; 931 931 case 52 : 932 932 { … … 995 995 long x; 996 996 sscanf(lstring_value(eval(CAR(args))),"%lx",&x); 997 return new_lisp_pointer((void *)(intptr_t)x);997 return LPointer::Create((void *)(intptr_t)x); 998 998 } break; 999 999 case 64 : … … 1392 1392 if (!a) 1393 1393 { 1394 lprint(args);1394 ((LObject *)args)->Print(); 1395 1395 lbreak("expecting y after x in play_sound\n"); 1396 1396 exit(1); … … 1478 1478 if (a<0 || a>=TOTAL_ABILITIES) 1479 1479 { 1480 lprint(args);1480 ((LObject *)args)->Print(); 1481 1481 lbreak("bad ability number for get_ability, should be 0..%d, not %d\n", 1482 1482 TOTAL_ABILITIES,a); … … 1573 1573 if (r<0 || b<0 || g<0 || r>255 || g>255 || b>255) 1574 1574 { 1575 lprint(args);1575 ((LObject *)args)->Print(); 1576 1576 lbreak("color out of range (0..255) in color lookup\n"); 1577 1577 exit(0); … … 1582 1582 { 1583 1583 view *v=current_object->controller(); 1584 if (!v) { lprint(args); printf("get_player_inputs : object has no view!\n"); }1584 if (!v) { ((LObject *)args)->Print(); printf("get_player_inputs : object has no view!\n"); } 1585 1585 else return v->x_suggestion; 1586 1586 } break; … … 1588 1588 { 1589 1589 view *v=current_object->controller(); 1590 if (!v) { lprint(args); printf("get_player_inputs : object has no view!\n"); }1590 if (!v) { ((LObject *)args)->Print(); printf("get_player_inputs : object has no view!\n"); } 1591 1591 else return v->y_suggestion; 1592 1592 } break; … … 1594 1594 { 1595 1595 view *v=current_object->controller(); 1596 if (!v) { lprint(args); printf("get_player_inputs : object has no view!\n"); }1596 if (!v) { ((LObject *)args)->Print(); printf("get_player_inputs : object has no view!\n"); } 1597 1597 else return v->b1_suggestion; 1598 1598 } break; … … 1600 1600 { 1601 1601 view *v=current_object->controller(); 1602 if (!v) { lprint(args); printf("get_player_inputs : object has no view!\n"); }1602 if (!v) { ((LObject *)args)->Print(); printf("get_player_inputs : object has no view!\n"); } 1603 1603 else return v->b2_suggestion; 1604 1604 } break; … … 1606 1606 { 1607 1607 view *v=current_object->controller(); 1608 if (!v) { lprint(args); printf("get_player_inputs : object has no view!\n"); }1608 if (!v) { ((LObject *)args)->Print(); printf("get_player_inputs : object has no view!\n"); } 1609 1609 else return v->b3_suggestion; 1610 1610 } break; … … 1615 1615 bg_ymul=lnumber_value(CAR(args)); args=CDR(args); 1616 1616 bg_ydiv=lnumber_value(CAR(args)); 1617 if (bg_xdiv==0) { bg_xdiv=1; lprint(args); dprintf("bg_set_scroll : cannot set xdiv to 0\n"); }1618 if (bg_ydiv==0) { bg_ydiv=1; lprint(args); dprintf("bg_set_scroll : cannot set ydiv to 0\n"); }1617 if (bg_xdiv==0) { bg_xdiv=1; ((LObject *)args)->Print(); dprintf("bg_set_scroll : cannot set xdiv to 0\n"); } 1618 if (bg_ydiv==0) { bg_ydiv=1; ((LObject *)args)->Print(); dprintf("bg_set_scroll : cannot set ydiv to 0\n"); } 1619 1619 } break; 1620 1620 case 179 : … … 1983 1983 { 1984 1984 view *v=current_object->controller(); 1985 if (!v) { lprint(args); printf("get_player_inputs : object has no view!\n"); }1985 if (!v) { ((LObject *)args)->Print(); printf("get_player_inputs : object has no view!\n"); } 1986 1986 else return v->pointer_x; 1987 1987 } break; … … 1989 1989 { 1990 1990 view *v=current_object->controller(); 1991 if (!v) { lprint(args); printf("get_player_inputs : object has no view!\n"); }1991 if (!v) { ((LObject *)args)->Print(); printf("get_player_inputs : object has no view!\n"); } 1992 1992 else return v->pointer_y; 1993 1993 } break; … … 2064 2064 { 2065 2065 view *v=current_object->controller(); 2066 if (!v) { lprint(args); printf("get_player_inputs : object has no view!\n"); }2066 if (!v) { ((LObject *)args)->Print(); printf("get_player_inputs : object has no view!\n"); } 2067 2067 else return v->kills; 2068 2068 } break; … … 2070 2070 { 2071 2071 view *v=current_object->controller(); 2072 if (!v) { lprint(args); printf("get_player_inputs : object has no view!\n"); }2072 if (!v) { ((LObject *)args)->Print(); printf("get_player_inputs : object has no view!\n"); } 2073 2073 else return v->tkills; 2074 2074 } break; … … 2076 2076 { 2077 2077 view *v=current_object->controller(); 2078 if (!v) { lprint(args); printf("get_player_inputs : object has no view!\n"); }2078 if (!v) { ((LObject *)args)->Print(); printf("get_player_inputs : object has no view!\n"); } 2079 2079 else return v->secrets; 2080 2080 } break; … … 2082 2082 { 2083 2083 view *v=current_object->controller(); 2084 if (!v) { lprint(args); printf("get_player_inputs : object has no view!\n"); }2084 if (!v) { ((LObject *)args)->Print(); printf("get_player_inputs : object has no view!\n"); } 2085 2085 else return v->tsecrets; 2086 2086 } break; … … 2088 2088 { 2089 2089 view *v=current_object->controller(); 2090 if (!v) { lprint(args); printf("get_player_inputs : object has no view!\n"); }2090 if (!v) { ((LObject *)args)->Print(); printf("get_player_inputs : object has no view!\n"); } 2091 2091 else v->kills=lnumber_value(CAR(args)); 2092 2092 } break; … … 2094 2094 { 2095 2095 view *v=current_object->controller(); 2096 if (!v) { lprint(args); printf("get_player_inputs : object has no view!\n"); }2096 if (!v) { ((LObject *)args)->Print(); printf("get_player_inputs : object has no view!\n"); } 2097 2097 else v->tkills=lnumber_value(CAR(args)); 2098 2098 } break; … … 2100 2100 { 2101 2101 view *v=current_object->controller(); 2102 if (!v) { lprint(args); printf("get_player_inputs : object has no view!\n"); }2102 if (!v) { ((LObject *)args)->Print(); printf("get_player_inputs : object has no view!\n"); } 2103 2103 else v->secrets=lnumber_value(CAR(args)); 2104 2104 } break; … … 2106 2106 { 2107 2107 view *v=current_object->controller(); 2108 if (!v) { lprint(args); printf("get_player_inputs : object has no view!\n"); }2108 if (!v) { ((LObject *)args)->Print(); printf("get_player_inputs : object has no view!\n"); } 2109 2109 else v->tsecrets=lnumber_value(CAR(args)); 2110 2110 } break; -
abuse/trunk/src/cop.cpp
r492 r493 227 227 void *list=NULL; 228 228 PtrRef r1(list); 229 push_onto_list( new_lisp_pointer(target),list);229 push_onto_list(LPointer::Create(target),list); 230 230 push_onto_list(LNumber::Create(angle),list); 231 231 push_onto_list(LNumber::Create(y2),list); 232 232 push_onto_list(LNumber::Create(x2),list); 233 233 push_onto_list(LNumber::Create(type),list); 234 push_onto_list( new_lisp_pointer(o->get_object(0)),list);234 push_onto_list(LPointer::Create(o->get_object(0)),list); 235 235 eval_function((LSymbol *)l_fire_object,list); 236 236 o->lvars[top_just_fired]=1; -
abuse/trunk/src/game.cpp
r492 r493 2313 2313 l_user_stack.push(prog); 2314 2314 while(*s==' ' || *s=='\t' || *s=='\r' || *s=='\n') s++; 2315 lprint(eval(prog));2315 ((LObject *)eval(prog))->Print(); 2316 2316 l_user_stack.pop(1); 2317 2317 } -
abuse/trunk/src/lcache.cpp
r492 r493 105 105 { return LNumber::Create(fp->read_uint32()); } break; 106 106 case L_CHARACTER : 107 { return new_lisp_character(fp->read_uint16()); } break;107 { return LChar::Create(fp->read_uint16()); } break; 108 108 case L_STRING : 109 109 { long l=fp->read_uint32(); -
abuse/trunk/src/lisp/lisp.cpp
r492 r493 41 41 42 42 bFILE *current_print_file=NULL; 43 LSymbol *lsym_root=NULL; 44 long ltotal_syms=0;45 43 44 LSymbol *LSymbol::root = NULL; 45 size_t LSymbol::count = 0; 46 46 47 47 … … 58 58 if(!block || item_type(block) != L_CONS_CELL) 59 59 { 60 lprint(block);60 ((LObject *)block)->Print(); 61 61 return; 62 62 } … … 69 69 dprintf("[...]"); 70 70 else 71 lprint(a);71 ((LObject *)a)->Print(); 72 72 } 73 73 if (block) 74 74 { 75 75 dprintf(" . "); 76 lprint(block);76 ((LObject *)block)->Print(); 77 77 } 78 78 dprintf(")"); … … 88 88 { 89 89 dprintf("%d> ", i); 90 lprint(*PtrRef::stack.sdata[i]);90 ((LObject *)*PtrRef::stack.sdata[i])->Print(); 91 91 } 92 92 } … … 142 142 PtrRef r1(prog); 143 143 while (*s==' ' || *s=='\t' || *s=='\r' || *s=='\n') s++; 144 lprint(eval(prog));144 ((LObject *)eval(prog))->Print(); 145 145 } while (*s); 146 146 } … … 220 220 } 221 221 222 LArray *LArray::Create(int size, void *rest) 223 { 224 PtrRef r11(rest); 225 size_t s = sizeof(LArray) 226 + ((size < 1 ? 1 : size) - 1) * sizeof(LObject *); 227 LArray *p = (LArray *)lmalloc(s, current_space); 228 p->type = L_1D_ARRAY; 229 p->size = size; 230 LObject **data = p->GetData(); 231 memset(data, 0, size * sizeof(LObject *)); 232 PtrRef r1(p); 233 234 if (rest) 235 { 236 void *x=eval(CAR(rest)); 237 if (x==colon_initial_contents) 238 { 239 x=eval(CAR(CDR(rest))); 240 data = p->GetData(); 241 for (int i=0;i<size;i++, x=CDR(x)) 242 { 243 if (!x) 244 { 245 lprint(rest); 246 lbreak("(make-array) incorrect list length\n"); 247 exit(0); 248 } 249 data[i] = (LObject *)CAR(x); 250 } 251 if (x) 252 { 253 lprint(rest); 254 lbreak("(make-array) incorrect list length\n"); 255 exit(0); 256 } 257 } 258 else if (x==colon_initial_element) 259 { 260 x=eval(CAR(CDR(rest))); 261 data = p->GetData(); 262 for (int i=0;i<size;i++) 263 data[i] = (LObject *)x; 264 } 265 else 266 { 267 lprint(x); 268 lbreak("Bad option argument to make-array\n"); 269 exit(0); 270 } 271 } 272 273 return p; 274 } 275 276 LFixedPoint *new_lisp_fixed_point(int32_t x) 277 { 278 LFixedPoint *p=(LFixedPoint *)lmalloc(sizeof(LFixedPoint), current_space); 279 p->type=L_FIXED_POINT; 280 p->x=x; 281 return p; 282 } 283 284 285 LObjectVar *new_lisp_object_var(int16_t number) 286 { 287 LObjectVar *p=(LObjectVar *)lmalloc(sizeof(LObjectVar), current_space); 288 p->type=L_OBJECT_VAR; 289 p->number=number; 290 return p; 291 } 292 293 294 struct LPointer *new_lisp_pointer(void *addr) 295 { 296 if (addr==NULL) return NULL; 297 LPointer *p=(LPointer *)lmalloc(sizeof(LPointer), current_space); 298 p->type=L_POINTER; 299 p->addr=addr; 300 return p; 301 } 302 303 struct LChar *new_lisp_character(uint16_t ch) 304 { 305 LChar *c=(LChar *)lmalloc(sizeof(LChar), current_space); 306 c->type=L_CHARACTER; 307 c->ch=ch; 308 return c; 309 } 310 311 struct LString *LString::Create(char const *string) 312 { 313 size_t size = sizeof(LString) + strlen(string); 222 LArray *LArray::Create(size_t len, void *rest) 223 { 224 PtrRef r11(rest); 225 size_t size = sizeof(LArray) + (len - 1) * sizeof(LObject *); 314 226 if (size < sizeof(LRedirect)) 315 227 size = sizeof(LRedirect); 316 228 317 LString *s = (LString *)lmalloc(size, current_space); 318 s->type = L_STRING; 229 LArray *p = (LArray *)lmalloc(size, current_space); 230 p->type = L_1D_ARRAY; 231 p->len = len; 232 LObject **data = p->GetData(); 233 memset(data, 0, len * sizeof(LObject *)); 234 PtrRef r1(p); 235 236 if (rest) 237 { 238 void *x = eval(CAR(rest)); 239 if (x == colon_initial_contents) 240 { 241 x = eval(CAR(CDR(rest))); 242 data = p->GetData(); 243 for (size_t i = 0; i < len; i++, x = CDR(x)) 244 { 245 if (!x) 246 { 247 ((LObject *)rest)->Print(); 248 lbreak("(make-array) incorrect list length\n"); 249 exit(0); 250 } 251 data[i] = (LObject *)CAR(x); 252 } 253 if (x) 254 { 255 ((LObject *)rest)->Print(); 256 lbreak("(make-array) incorrect list length\n"); 257 exit(0); 258 } 259 } 260 else if (x == colon_initial_element) 261 { 262 x = eval(CAR(CDR(rest))); 263 data = p->GetData(); 264 for (size_t i = 0; i < len; i++) 265 data[i] = (LObject *)x; 266 } 267 else 268 { 269 ((LObject *)x)->Print(); 270 lbreak("Bad option argument to make-array\n"); 271 exit(0); 272 } 273 } 274 275 return p; 276 } 277 278 LFixedPoint *LFixedPoint::Create(int32_t x) 279 { 280 size_t size = sizeof(LFixedPoint); 281 if (size < sizeof(LRedirect)) 282 size = sizeof(LRedirect); 283 284 LFixedPoint *p = (LFixedPoint *)lmalloc(size, current_space); 285 p->type = L_FIXED_POINT; 286 p->x = x; 287 return p; 288 } 289 290 LObjectVar *LObjectVar::Create(int index) 291 { 292 size_t size = sizeof(LObjectVar); 293 if (size < sizeof(LRedirect)) 294 size = sizeof(LRedirect); 295 296 LObjectVar *p = (LObjectVar *)lmalloc(size, current_space); 297 p->type = L_OBJECT_VAR; 298 p->index = index; 299 return p; 300 } 301 302 LPointer *LPointer::Create(void *addr) 303 { 304 if (addr == NULL) 305 return NULL; 306 size_t size = sizeof(LPointer); 307 if (size < sizeof(LRedirect)) 308 size = sizeof(LRedirect); 309 310 LPointer *p = (LPointer *)lmalloc(size, current_space); 311 p->type = L_POINTER; 312 p->addr = addr; 313 return p; 314 } 315 316 LChar *LChar::Create(uint16_t ch) 317 { 318 size_t size = sizeof(LChar); 319 if (size < sizeof(LRedirect)) 320 size = sizeof(LRedirect); 321 322 LChar *c = (LChar *)lmalloc(size, current_space); 323 c->type = L_CHARACTER; 324 c->ch = ch; 325 return c; 326 } 327 328 struct LString *LString::Create(char const *string) 329 { 330 LString *s = Create(strlen(string) + 1); 319 331 strcpy(s->str, string); 320 332 return s; … … 323 335 struct LString *LString::Create(char const *string, int length) 324 336 { 325 size_t size = sizeof(LString) + length; 326 if (size < sizeof(LRedirect)) 327 size = sizeof(LRedirect); 328 329 LString *s = (LString *)lmalloc(size, current_space); 330 s->type = L_STRING; 337 LString *s = Create(length + 1); 331 338 memcpy(s->str, string, length); 332 339 s->str[length] = 0; … … 349 356 LUserFunction *new_lisp_user_function(void *arg_list, void *block_list) 350 357 { 351 PtrRef r1(arg_list), r2(block_list); 352 LUserFunction *lu=(LUserFunction *)lmalloc(sizeof(LUserFunction), current_space); 353 lu->type=L_USER_FUNCTION; 354 lu->arg_list=arg_list; 355 lu->block_list=block_list; 356 return lu; 358 PtrRef r1(arg_list), r2(block_list); 359 360 size_t size = sizeof(LUserFunction); 361 if (size < sizeof(LRedirect)) 362 size = sizeof(LRedirect); 363 364 LUserFunction *lu = (LUserFunction *)lmalloc(size, current_space); 365 lu->type = L_USER_FUNCTION; 366 lu->arg_list = arg_list; 367 lu->block_list = block_list; 368 return lu; 357 369 } 358 370 #else 359 371 LUserFunction *new_lisp_user_function(intptr_t arg_list, intptr_t block_list) 360 372 { 361 int sp=current_space; 362 if (current_space!=GC_SPACE) 363 current_space=PERM_SPACE; // make sure all functions get defined in permanant space 364 365 LUserFunction *lu=(LUserFunction *)lmalloc(sizeof(LUserFunction), current_space); 366 lu->type=L_USER_FUNCTION; 367 lu->alist=arg_list; 368 lu->blist=block_list; 369 370 current_space=sp; 371 372 return lu; 373 } 374 #endif 375 373 // Make sure all functions get defined in permanent space 374 int sp = current_space; 375 if (current_space != GC_SPACE) 376 current_space = PERM_SPACE; 377 378 size_t size = sizeof(LUserFunction); 379 if (size < sizeof(LRedirect)) 380 size = sizeof(LRedirect); 381 382 LUserFunction *lu = (LUserFunction *)lmalloc(size, current_space); 383 lu->type = L_USER_FUNCTION; 384 lu->alist = arg_list; 385 lu->blist = block_list; 386 387 current_space = sp; 388 389 return lu; 390 } 391 #endif 376 392 377 393 LSysFunction *new_lisp_sys_function(int min_args, int max_args, int fun_number) 378 394 { 379 // sys functions should reside in permanant space 380 LSysFunction *ls=(LSysFunction *)lmalloc(sizeof(LSysFunction), 381 current_space==GC_SPACE ? GC_SPACE : PERM_SPACE); 382 ls->type=L_SYS_FUNCTION; 383 ls->min_args=min_args; 384 ls->max_args=max_args; 385 ls->fun_number=fun_number; 386 return ls; 395 size_t size = sizeof(LSysFunction); 396 if (size < sizeof(LRedirect)) 397 size = sizeof(LRedirect); 398 399 // System functions should reside in permanant space 400 int space = (current_space == GC_SPACE) ? GC_SPACE : PERM_SPACE; 401 LSysFunction *ls = (LSysFunction *)lmalloc(size, space); 402 ls->type = L_SYS_FUNCTION; 403 ls->min_args = min_args; 404 ls->max_args = max_args; 405 ls->fun_number = fun_number; 406 return ls; 387 407 } 388 408 389 409 LSysFunction *new_lisp_c_function(int min_args, int max_args, int fun_number) 390 410 { 391 // sys functions should reside in permanant space 392 LSysFunction *ls=(LSysFunction *)lmalloc(sizeof(LSysFunction), 393 current_space==GC_SPACE ? GC_SPACE : PERM_SPACE); 394 ls->type=L_C_FUNCTION; 395 ls->min_args=min_args; 396 ls->max_args=max_args; 397 ls->fun_number=fun_number; 398 return ls; 411 LSysFunction *ls = new_lisp_sys_function(min_args, max_args, fun_number); 412 ls->type = L_C_FUNCTION; 413 return ls; 399 414 } 400 415 401 416 LSysFunction *new_lisp_c_bool(int min_args, int max_args, int fun_number) 402 417 { 403 // sys functions should reside in permanant space 404 LSysFunction *ls=(LSysFunction *)lmalloc(sizeof(LSysFunction), 405 current_space==GC_SPACE ? GC_SPACE : PERM_SPACE); 406 ls->type=L_C_BOOL; 407 ls->min_args=min_args; 408 ls->max_args=max_args; 409 ls->fun_number=fun_number; 410 return ls; 418 LSysFunction *ls = new_lisp_sys_function(min_args, max_args, fun_number); 419 ls->type = L_C_BOOL; 420 return ls; 411 421 } 412 422 413 423 LSysFunction *new_user_lisp_function(int min_args, int max_args, int fun_number) 414 424 { 415 // sys functions should reside in permanant space 416 LSysFunction *ls=(LSysFunction *)lmalloc(sizeof(LSysFunction), 417 current_space==GC_SPACE ? GC_SPACE : PERM_SPACE); 418 ls->type=L_L_FUNCTION; 419 ls->min_args=min_args; 420 ls->max_args=max_args; 421 ls->fun_number=fun_number; 422 return ls; 423 } 424 425 LNumber *new_lisp_node(long num) 426 { 427 LNumber *n=(LNumber *)lmalloc(sizeof(LNumber), current_space); 428 n->type=L_NUMBER; 429 n->num=num; 430 return n; 425 LSysFunction *ls = new_lisp_sys_function(min_args, max_args, fun_number); 426 ls->type = L_L_FUNCTION; 427 return ls; 431 428 } 432 429 433 430 LSymbol *new_lisp_symbol(char *name) 434 431 { 435 LSymbol *s=(LSymbol *)lmalloc(sizeof(LSymbol), current_space); 436 s->type=L_SYMBOL; 437 s->name=LString::Create(name); 438 s->value=l_undefined; 439 s->function=l_undefined; 432 size_t size = sizeof(LSymbol); 433 if (size < sizeof(LRedirect)) 434 size = sizeof(LRedirect); 435 436 LSymbol *s = (LSymbol *)lmalloc(size, current_space); 437 s->type = L_SYMBOL; 438 s->name = LString::Create(name); 439 s->value = l_undefined; 440 s->function = l_undefined; 440 441 #ifdef L_PROFILE 441 s->time_taken=0;442 #endif 443 return s;442 s->time_taken = 0; 443 #endif 444 return s; 444 445 } 445 446 446 447 LNumber *LNumber::Create(long num) 447 448 { 448 LNumber *s = (LNumber *)lmalloc(sizeof(LNumber), current_space); 449 s->type = L_NUMBER; 450 s->num = num; 451 return s; 449 size_t size = sizeof(LNumber); 450 if (size < sizeof(LRedirect)) 451 size = sizeof(LRedirect); 452 453 LNumber *n = (LNumber *)lmalloc(size, current_space); 454 n->type = L_NUMBER; 455 n->num = num; 456 return n; 452 457 } 453 458 454 459 LList *LList::Create() 455 460 { 456 LList *c = (LList *)lmalloc(sizeof(LList), current_space); 461 size_t size = sizeof(LList); 462 if (size < sizeof(LRedirect)) 463 size = sizeof(LRedirect); 464 465 LList *c = (LList *)lmalloc(size, current_space); 457 466 c->type = L_CONS_CELL; 458 467 c->car = NULL; … … 503 512 else if (item_type(lpointer)!=L_POINTER) 504 513 { 505 lprint(lpointer);514 ((LObject *)lpointer)->Print(); 506 515 lbreak(" is not a pointer\n"); 507 516 exit(0); … … 525 534 default : 526 535 { 527 lprint(lnumber);536 ((LObject *)lnumber)->Print(); 528 537 lbreak(" is not a number\n"); 529 538 exit(0); … … 538 547 if (item_type(this) != L_STRING) 539 548 { 540 lprint(this);549 Print(); 541 550 lbreak(" is not a string\n"); 542 551 exit(0); … … 575 584 if (item_type(c)!=L_CHARACTER) 576 585 { 577 lprint(c);586 ((LObject *)c)->Print(); 578 587 lbreak("is not a character\n"); 579 588 exit(0); … … 593 602 default : 594 603 { 595 lprint(c);604 ((LObject *)c)->Print(); 596 605 lbreak(" is not a number\n"); 597 606 exit(0); … … 626 635 } 627 636 628 LObject *LArray::Get( longx)637 LObject *LArray::Get(int x) 629 638 { 630 639 #ifdef TYPE_CHECKING 631 640 if (type != L_1D_ARRAY) 632 641 { 633 lprint(this);642 Print(); 634 643 lbreak("is not an array\n"); 635 644 exit(0); 636 645 } 637 646 #endif 638 if (x >= size|| x < 0)647 if (x >= (int)len || x < 0) 639 648 { 640 649 lbreak("array reference out of bounds (%d)\n", x); 641 650 exit(0); 642 651 } 643 return GetData()[x];652 return data[x]; 644 653 } 645 654 … … 820 829 LSymbol *LSymbol::Find(char const *name) 821 830 { 822 LSymbol *p = lsym_root;831 LSymbol *p = root; 823 832 while (p) 824 833 { … … 833 842 LSymbol *LSymbol::FindOrCreate(char const *name) 834 843 { 835 LSymbol *p = lsym_root;836 LSymbol **parent = & lsym_root;844 LSymbol *p = root; 845 LSymbol **parent = &root; 837 846 while (p) 838 847 { … … 861 870 p->left = p->right = NULL; 862 871 *parent = p; 863 ltotal_syms++;872 count++; 864 873 865 874 current_space = sp; … … 900 909 if (this && item_type(this) != (ltype)L_CONS_CELL) 901 910 { 902 lprint(this);911 Print(); 903 912 lbreak(" is not a sequence\n"); 904 913 exit(0); … … 922 931 if (l1!=l2) 923 932 { 924 lprint(list1);925 lprint(list2);933 ((LObject *)list1)->Print(); 934 ((LObject *)list2)->Print(); 926 935 lbreak("... are not the same length (pairlis)\n"); 927 936 exit(0); … … 975 984 } 976 985 977 LSymbol *add_c_object(void *symbol, int 16_t number)986 LSymbol *add_c_object(void *symbol, int index) 978 987 { 979 988 need_perm_space("add_c_object"); … … 984 993 exit(0); 985 994 } 986 else s->value= new_lisp_object_var(number);995 else s->value=LObjectVar::Create(index); 987 996 return NULL; 988 997 } … … 1239 1248 read_ltoken(s, n); // read character name 1240 1249 if (!strcmp(n, "newline")) 1241 ret =new_lisp_character('\n');1250 ret = LChar::Create('\n'); 1242 1251 else if (!strcmp(n, "space")) 1243 ret =new_lisp_character(' ');1252 ret = LChar::Create(' '); 1244 1253 else 1245 ret =new_lisp_character(n[0]);1254 ret = LChar::Create(n[0]); 1246 1255 } 1247 1256 else if (n[1]==0) // short hand for function … … 1295 1304 } 1296 1305 1297 void lprint(void *i) 1298 { 1299 print_level++; 1300 if (!i) 1301 lprint_string("nil"); 1302 else 1303 { 1304 switch ((short)item_type(i)) 1305 { 1306 case L_CONS_CELL : 1307 { 1308 LList *cs=(LList *)i; 1309 lprint_string("("); 1310 for (;cs;cs=(LList *)lcdr(cs)) 1306 void LObject::Print() 1307 { 1308 char buf[32]; 1309 1310 print_level++; 1311 1312 switch (item_type(this)) 1313 { 1314 case L_CONS_CELL: 1315 if (!this) 1316 { 1317 lprint_string("nil"); 1318 } 1319 else 1320 { 1321 LList *cs = (LList *)this; 1322 lprint_string("("); 1323 for (; cs; cs = (LList *)lcdr(cs)) 1324 { 1325 if (item_type(cs) == (ltype)L_CONS_CELL) 1311 1326 { 1312 if (item_type(cs)==(ltype)L_CONS_CELL) 1313 { 1314 lprint(cs->car); 1327 cs->car->Print(); 1315 1328 if (cs->cdr) 1316 lprint_string(" ");1317 1318 1319 1329 lprint_string(" "); 1330 } 1331 else 1332 { 1320 1333 lprint_string(". "); 1321 lprint(cs); 1322 cs=NULL; 1323 } 1334 cs->Print(); 1335 cs = NULL; 1324 1336 } 1325 lprint_string(")"); 1326 } 1327 break; 1328 case L_NUMBER : 1329 { 1330 char num[10]; 1331 sprintf(num, "%ld", ((LNumber *)i)->num); 1332 lprint_string(num); 1333 } 1334 break; 1335 case L_SYMBOL : 1336 lprint_string(((LSymbol *)i)->name->GetString()); 1337 break; 1338 case L_USER_FUNCTION : 1339 case L_SYS_FUNCTION : 1337 } 1338 lprint_string(")"); 1339 } 1340 break; 1341 case L_NUMBER: 1342 sprintf(buf, "%ld", ((LNumber *)this)->num); 1343 lprint_string(buf); 1344 break; 1345 case L_SYMBOL: 1346 lprint_string(((LSymbol *)this)->name->GetString()); 1347 break; 1348 case L_USER_FUNCTION: 1349 case L_SYS_FUNCTION: 1340 1350 lprint_string("err... function?"); 1341 break;1342 case L_C_FUNCTION:1351 break; 1352 case L_C_FUNCTION: 1343 1353 lprint_string("C function, returns number\n"); 1344 break;1345 case L_C_BOOL:1354 break; 1355 case L_C_BOOL: 1346 1356 lprint_string("C boolean function\n"); 1347 break;1348 case L_L_FUNCTION:1357 break; 1358 case L_L_FUNCTION: 1349 1359 lprint_string("External lisp function\n"); 1350 break; 1351 case L_STRING : 1352 { 1353 if (current_print_file) 1354 lprint_string(lstring_value(i)); 1355 else 1356 dprintf("\"%s\"", lstring_value(i)); 1357 } 1358 break; 1359 1360 case L_POINTER : 1361 { 1362 char ptr[10]; 1363 sprintf(ptr, "%p", lpointer_value(i)); 1364 lprint_string(ptr); 1365 } 1366 break; 1367 case L_FIXED_POINT : 1368 { 1369 char num[20]; 1370 sprintf(num, "%g", (lfixed_point_value(i)>>16)+ 1371 ((lfixed_point_value(i)&0xffff))/(double)0x10000); 1372 lprint_string(num); 1373 } break; 1374 case L_CHARACTER : 1375 { 1376 if (current_print_file) 1377 { 1378 uint8_t ch=((LChar *)i)->ch; 1379 current_print_file->write(&ch, 1); 1380 } else 1381 { 1382 uint16_t ch=((LChar *)i)->ch; 1383 dprintf("#\\"); 1384 switch (ch) 1385 { 1386 case '\n' : 1387 { dprintf("newline"); break; } 1388 case ' ' : 1389 { dprintf("space"); break; } 1390 default : 1391 dprintf("%c", ch); 1392 } 1393 } 1394 } break; 1395 case L_OBJECT_VAR : 1396 { 1397 l_obj_print(((LObjectVar *)i)->number); 1398 } break; 1399 case L_1D_ARRAY : 1400 { 1401 LArray *a = (LArray *)i; 1402 LObject **data = a->GetData(); 1403 dprintf("#("); 1404 for (int j = 0; j < a->size; j++) 1405 { 1406 lprint(data[j]); 1407 if (j != a->size - 1) 1408 dprintf(" "); 1409 } 1410 dprintf(")"); 1411 } break; 1412 case L_COLLECTED_OBJECT : 1413 { 1414 lprint_string("GC_refrence->"); 1415 lprint(((LRedirect *)i)->new_reference); 1416 } break; 1417 default : 1360 break; 1361 case L_STRING: 1362 if (current_print_file) 1363 lprint_string(lstring_value(this)); 1364 else 1365 dprintf("\"%s\"", lstring_value(this)); 1366 break; 1367 case L_POINTER: 1368 sprintf(buf, "%p", lpointer_value(this)); 1369 lprint_string(buf); 1370 break; 1371 case L_FIXED_POINT: 1372 sprintf(buf, "%g", (lfixed_point_value(this) >> 16) + 1373 ((lfixed_point_value(this) & 0xffff)) / (double)0x10000); 1374 lprint_string(buf); 1375 break; 1376 case L_CHARACTER: 1377 if (current_print_file) 1378 { 1379 uint8_t ch = ((LChar *)this)->ch; 1380 current_print_file->write(&ch, 1); 1381 } 1382 else 1383 { 1384 uint16_t ch = ((LChar *)this)->ch; 1385 dprintf("#\\"); 1386 switch (ch) 1387 { 1388 case '\n': 1389 dprintf("newline"); break; 1390 case ' ': 1391 dprintf("space"); break; 1392 default: 1393 dprintf("%c", ch); break; 1394 } 1395 } 1396 break; 1397 case L_OBJECT_VAR: 1398 l_obj_print(((LObjectVar *)this)->index); 1399 break; 1400 case L_1D_ARRAY: 1401 { 1402 LArray *a = (LArray *)this; 1403 LObject **data = a->GetData(); 1404 dprintf("#("); 1405 for (size_t j = 0; j < a->len; j++) 1406 { 1407 data[j]->Print(); 1408 if (j != a->len - 1) 1409 dprintf(" "); 1410 } 1411 dprintf(")"); 1412 } 1413 break; 1414 case L_COLLECTED_OBJECT: 1415 lprint_string("GC_refrence->"); 1416 ((LRedirect *)this)->ref->Print(); 1417 break; 1418 default: 1418 1419 dprintf("Shouldn't happen\n"); 1419 1420 } 1420 } 1421 print_level--;1422 if (!print_level && !current_print_file)1423 dprintf("\n");1421 1422 print_level--; 1423 if (!print_level && !current_print_file) 1424 dprintf("\n"); 1424 1425 } 1425 1426 … … 1432 1433 if (item_type(sym)!=L_SYMBOL) 1433 1434 { 1434 lprint(sym);1435 sym->Print(); 1435 1436 lbreak("EVAL : is not a function name (not symbol either)"); 1436 1437 exit(0); … … 1461 1462 default : 1462 1463 { 1463 lprint(sym);1464 sym->Print(); 1464 1465 lbreak(" is not a function name"); 1465 1466 exit(0); … … 1474 1475 if (args<req_min) 1475 1476 { 1476 lprint(arg_list);1477 lprint(sym->name);1477 ((LObject *)arg_list)->Print(); 1478 sym->name->Print(); 1478 1479 lbreak("\nToo few parameters to function\n"); 1479 1480 exit(0); 1480 1481 } else if (req_max!=-1 && args>req_max) 1481 1482 { 1482 lprint(arg_list);1483 lprint(sym->name);1483 ((LObject *)arg_list)->Print(); 1484 sym->name->Print(); 1484 1485 lbreak("\nToo many parameters to function\n"); 1485 1486 exit(0); … … 1560 1561 { 1561 1562 bFILE *fp=open_file("preport.out", "wb"); 1562 pro_print(fp, lsym_root);1563 pro_print(fp, LSymbol::root); 1563 1564 delete fp; 1564 1565 } … … 1577 1578 default : 1578 1579 { 1579 lprint(sym);1580 ((LObject *)sym)->Print(); 1580 1581 lbreak(" is not a function\n"); 1581 1582 exit(0); … … 1681 1682 else 1682 1683 { 1683 lprint(str_eval[i]);1684 ((LObject *)str_eval[i])->Print(); 1684 1685 lbreak(" is not a character\n"); 1685 1686 exit(0); … … 1690 1691 case L_STRING : len+=strlen(lstring_value(str_eval[i])); break; 1691 1692 default : 1692 lprint(prog_list);1693 ((LObject *)prog_list)->Print(); 1693 1694 lbreak("type not supported\n"); 1694 1695 exit(0); … … 1731 1732 else 1732 1733 { 1733 lprint(prog_list);1734 ((LObject *)prog_list)->Print(); 1734 1735 lbreak("concat operation not supported, try 'string\n"); 1735 1736 exit(0); … … 1799 1800 { 1800 1801 ret=eval(CAR(arg_list)); arg_list=CDR(arg_list); 1801 lprint(ret);1802 ((LObject *)ret)->Print(); 1802 1803 } 1803 1804 return ret; … … 1815 1816 case L_CONS_CELL : ret = LNumber::Create(((LList *)v)->GetLength()); break; 1816 1817 default : 1817 { lprint(v); 1818 { 1819 ((LObject *)v)->Print(); 1818 1820 lbreak("length : type not supported\n"); 1819 1821 } … … 1887 1889 } while (arg_list); 1888 1890 1889 ret =new_lisp_fixed_point(sum);1891 ret = LFixedPoint::Create(sum); 1890 1892 } else 1891 1893 { sum=1; … … 1909 1911 if (item_type(i)!=L_NUMBER) 1910 1912 { 1911 lprint(i);1913 ((LObject *)i)->Print(); 1912 1914 lbreak("/ only defined for numbers, cannot divide "); 1913 1915 exit(0); … … 1968 1970 case L_OBJECT_VAR : 1969 1971 { 1970 l_obj_set(((LObjectVar *)(((LSymbol *)i)->value))-> number, set_to);1972 l_obj_set(((LObjectVar *)(((LSymbol *)i)->value))->index, set_to); 1971 1973 } break; 1972 1974 default : … … 1983 1985 car=eval(CAR(CDR(i))); 1984 1986 if (!car || item_type(car)!=L_CONS_CELL) 1985 { lprint(car); lbreak("setq car : evaled object is not a cons cell\n"); exit(0); }1987 { ((LObject *)car)->Print(); lbreak("setq car : evaled object is not a cons cell\n"); exit(0); } 1986 1988 ((LList *)car)->car = (LObject *)set_to; 1987 1989 } else if (car==cdr_symbol) … … 1989 1991 car=eval(CAR(CDR(i))); 1990 1992 if (!car || item_type(car)!=L_CONS_CELL) 1991 { lprint(car); lbreak("setq cdr : evaled object is not a cons cell\n"); exit(0); }1993 { ((LObject *)car)->Print(); lbreak("setq cdr : evaled object is not a cons cell\n"); exit(0); } 1992 1994 ((LList *)car)->cdr = (LObject *)set_to; 1993 1995 } else if (car==aref_symbol) … … 1999 2001 if (item_type(a) != L_1D_ARRAY) 2000 2002 { 2001 lprint(a);2003 a->Print(); 2002 2004 lbreak("is not an array (aref)\n"); 2003 2005 exit(0); 2004 2006 } 2005 2007 #endif 2006 long num=lnumber_value(eval(CAR(CDR(CDR(i)))));2008 int num = lnumber_value(eval(CAR(CDR(CDR(i))))); 2007 2009 #ifdef TYPE_CHECKING 2008 if (num >= a->size|| num < 0)2010 if (num >= (int)a->len || num < 0) 2009 2011 { 2010 2012 lbreak("aref : value of bounds (%d)\n", num); … … 2025 2027 default : 2026 2028 { 2027 lprint(i);2029 ((LObject *)i)->Print(); 2028 2030 lbreak("setq/setf only defined for symbols and arrays now..\n"); 2029 2031 exit(0); … … 2079 2081 if (item_type(var_name)!=L_SYMBOL) 2080 2082 { 2081 lprint(var_name);2083 ((LObject *)var_name)->Print(); 2082 2084 lbreak("should be a symbol (let)\n"); 2083 2085 exit(0); … … 2116 2118 if (item_type(symbol)!=L_SYMBOL) 2117 2119 { 2118 lprint(symbol);2120 symbol->Print(); 2119 2121 lbreak(" is not a symbol! (DEFUN)\n"); 2120 2122 exit(0); … … 2123 2125 if (item_type(arg_list)!=L_CONS_CELL) 2124 2126 { 2125 lprint(arg_list);2127 ((LObject *)arg_list)->Print(); 2126 2128 lbreak("is not a lambda list (DEFUN)\n"); 2127 2129 exit(0); … … 2188 2190 default : 2189 2191 { 2190 lprint(i);2192 ((LObject *)i)->Print(); 2191 2193 lbreak(" is not character type\n"); 2192 2194 exit(0); … … 2200 2202 if (item_type(i)!=L_NUMBER) 2201 2203 { 2202 lprint(i);2204 ((LObject *)i)->Print(); 2203 2205 lbreak(" is not number type\n"); 2204 2206 exit(0); 2205 2207 } 2206 ret =new_lisp_character(((LNumber *)i)->num);2208 ret = LChar::Create(((LNumber *)i)->num); 2207 2209 } break; 2208 2210 case SYS_FUNC_COND: … … 2294 2296 if (item_type(symb)!=L_SYMBOL) 2295 2297 { 2296 lprint(symb);2298 ((LObject *)symb)->Print(); 2297 2299 lbreak(" is not a symbol (symbol-name)\n"); 2298 2300 exit(0); … … 2429 2431 case SYS_FUNC_COMMA: 2430 2432 { 2431 lprint(arg_list);2433 ((LObject *)arg_list)->Print(); 2432 2434 lbreak("comma is illegal outside of backquote\n"); 2433 2435 exit(0); … … 2444 2446 resize_perm(lnumber_value(eval(CAR(arg_list)))); break; 2445 2447 case SYS_FUNC_COS: 2446 ret =new_lisp_fixed_point(lisp_cos(lnumber_value(eval(CAR(arg_list))))); break;2448 ret = LFixedPoint::Create(lisp_cos(lnumber_value(eval(CAR(arg_list))))); break; 2447 2449 case SYS_FUNC_SIN: 2448 ret =new_lisp_fixed_point(lisp_sin(lnumber_value(eval(CAR(arg_list))))); break;2450 ret = LFixedPoint::Create(lisp_sin(lnumber_value(eval(CAR(arg_list))))); break; 2449 2451 case SYS_FUNC_ATAN2: 2450 2452 { … … 2472 2474 #ifdef TYPE_CHECKING 2473 2475 if (item_type(s)!=L_SYMBOL) 2474 { lprint(arg_list); 2476 { 2477 ((LObject *)arg_list)->Print(); 2475 2478 lbreak("expecting (sybmol value) for enum\n"); 2476 2479 exit(0); … … 2482 2485 default : 2483 2486 { 2484 lprint(arg_list);2487 ((LObject *)arg_list)->Print(); 2485 2488 lbreak("expecting symbol or (symbol value) in enum\n"); 2486 2489 exit(0); … … 2678 2681 { lbreak("elt : out of range of string\n"); ret=NULL; } 2679 2682 else 2680 ret =new_lisp_character(st[x]);2683 ret = LChar::Create(st[x]); 2681 2684 } break; 2682 2685 case SYS_FUNC_LISTP: … … 2756 2759 else if (x<0) 2757 2760 { lbreak("SCHAR: index should not be negative\n"); exit(0); } 2758 return new_lisp_character(s[x]);2761 return LChar::Create(s[x]); 2759 2762 } break; 2760 2763 case SYS_FUNC_SYMBOLP: … … 2781 2784 2782 2785 if (item_type(l1)!=L_CONS_CELL) 2783 { lprint(l1); lbreak("first arg should be a list\n"); }2786 { ((LObject *)l1)->Print(); lbreak("first arg should be a list\n"); } 2784 2787 do 2785 2788 { … … 2875 2878 if (item_type(sym)!=L_SYMBOL) 2876 2879 { 2877 lprint(sym);2880 ((LObject *)sym)->Print(); 2878 2881 lbreak("EVAL : is not a function name (not symbol either)"); 2879 2882 exit(0); … … 2890 2893 if (item_type(fun)!=L_USER_FUNCTION) 2891 2894 { 2892 lprint(sym);2895 ((LObject *)sym)->Print(); 2893 2896 lbreak("is not a user defined function\n"); 2894 2897 } … … 2928 2931 { 2929 2932 if (!arg_list) 2930 { lprint(sym);lbreak("too few parameter to function\n"); exit(0); }2933 { ((LObject *)sym)->Print(); lbreak("too few parameter to function\n"); exit(0); } 2931 2934 l_user_stack.push(eval(CAR(arg_list))); 2932 2935 f_arg=CDR(f_arg); … … 2945 2948 2946 2949 if (f_arg) 2947 { lprint(sym);lbreak("too many parameter to function\n"); exit(0); }2950 { ((LObject *)sym)->Print(); lbreak("too many parameter to function\n"); exit(0); } 2948 2951 2949 2952 … … 2992 2995 space_size[TMP_SPACE]-((char *)free_space[TMP_SPACE]-(char *)space[TMP_SPACE]), 2993 2996 PtrRef::stack.son); 2994 lprint(prog);2997 ((LObject *)prog)->Print(); 2995 2998 2996 2999 dprintf("\n"); … … 3017 3020 ret = ((LSymbol *)prog)->GetValue(); 3018 3021 if (item_type(ret)==L_OBJECT_VAR) 3019 ret=l_obj_get(((LObjectVar *)ret)-> number);3022 ret=l_obj_get(((LObjectVar *)ret)->index); 3020 3023 } 3021 3024 } break; … … 3037 3040 space_size[TMP_SPACE]-((char *)free_space[TMP_SPACE]-(char *)space[TMP_SPACE]), 3038 3041 PtrRef::stack.son); 3039 lprint(ret);3042 ((LObject *)ret)->Print(); 3040 3043 dprintf("\n"); 3041 3044 } … … 3047 3050 3048 3051 return ret; 3049 }3050 3051 int total_symbols()3052 {3053 return ltotal_syms;3054 3052 } 3055 3053 … … 3090 3088 { 3091 3089 unsigned int i; 3092 lsym_root = NULL;3090 LSymbol::root = NULL; 3093 3091 total_user_functions = 0; 3094 3092 … … 3110 3108 current_space=TMP_SPACE; 3111 3109 dprintf("Lisp : %d symbols defined, %d system functions, %d pre-compiled functions\n", 3112 total_symbols(), sizeof(sys_funcs) / sizeof(*sys_funcs), total_user_functions);3110 LSymbol::count, sizeof(sys_funcs) / sizeof(*sys_funcs), total_user_functions); 3113 3111 } 3114 3112 3115 3113 void lisp_uninit() 3116 3114 { 3117 free(space[0]);3118 free(space[1]);3119 ldelete_syms(lsym_root);3120 lsym_root=NULL;3121 ltotal_syms=0;3115 free(space[0]); 3116 free(space[1]); 3117 ldelete_syms(LSymbol::root); 3118 LSymbol::root = NULL; 3119 LSymbol::count = 0; 3122 3120 } 3123 3121 … … 3132 3130 if (item_type(this) != L_SYMBOL) 3133 3131 { 3134 lprint(this);3132 Print(); 3135 3133 lbreak("is not a symbol\n"); 3136 3134 exit(0); … … 3145 3143 if (item_type(this) != L_SYMBOL) 3146 3144 { 3147 lprint(this);3145 Print(); 3148 3146 lbreak("is not a symbol\n"); 3149 3147 exit(0); … … 3161 3159 if (item_type(this) != L_SYMBOL) 3162 3160 { 3163 lprint(this);3161 Print(); 3164 3162 lbreak("is not a symbol\n"); 3165 3163 exit(0); … … 3174 3172 if (item_type(this) != L_SYMBOL) 3175 3173 { 3176 lprint(this);3174 Print(); 3177 3175 lbreak("is not a symbol\n"); 3178 3176 exit(0); … … 3187 3185 if (item_type(this) != L_SYMBOL) 3188 3186 { 3189 lprint(this);3187 Print(); 3190 3188 lbreak("is not a symbol\n"); 3191 3189 exit(0); -
abuse/trunk/src/lisp/lisp.h
r492 r493 47 47 struct LObject 48 48 { 49 void Print(); 50 49 51 ltype type; 50 52 }; … … 52 54 struct LObjectVar : LObject 53 55 { 54 long number; 56 static LObjectVar *Create(int index); 57 58 int index; 55 59 }; 56 60 … … 73 77 struct LRedirect : LObject 74 78 { 75 LObject * new_reference;79 LObject *ref; 76 80 }; 77 81 … … 84 88 char *GetString(); 85 89 86 char str[1]; 90 private: 91 char str[1]; /* Can be allocated much larger than 1 */ 87 92 }; 88 93 89 94 struct LSymbol : LObject 90 95 { 96 /* Factories */ 91 97 static LSymbol *Find(char const *name); 92 98 static LSymbol *FindOrCreate(char const *name); 93 99 100 /* Methods */ 94 101 LString *GetName(); 95 102 LObject *GetFunction(); … … 100 107 void SetNumber(long num); 101 108 109 /* Members */ 102 110 #ifdef L_PROFILE 103 111 float time_taken; … … 107 115 LString *name; 108 116 LSymbol *left, *right; // tree structure 117 118 /* Static members */ 119 static LSymbol *root; 120 static size_t count; 109 121 }; 110 122 … … 126 138 struct LArray : LObject 127 139 { 128 static LArray *Create(int size, void *rest); 129 140 /* Factories */ 141 static LArray *Create(size_t len, void *rest); 142 143 /* Methods */ 130 144 inline LObject **GetData() { return data; } 131 LObject *Get( longx);132 133 unsigned short size;134 // size * sizeof (void *) follows1145 LObject *Get(int x); 146 147 /* Members */ 148 size_t len; 135 149 136 150 private: 137 LObject *data[1]; 151 LObject *data[1]; /* Can be allocated much larger than 1 */ 138 152 }; 139 153 140 154 struct LChar : LObject 141 155 { 142 int16_t pad; 156 static LChar *Create(uint16_t ch); 157 143 158 uint16_t ch; 144 159 }; … … 146 161 struct LPointer : LObject 147 162 { 163 static LPointer *Create(void *addr); 164 148 165 void *addr; 149 166 }; … … 151 168 struct LFixedPoint : LObject 152 169 { 170 static LFixedPoint *Create(int32_t x); 171 153 172 int32_t x; 154 173 }; … … 170 189 void *lisp_eq(void *n1, void *n2); 171 190 void *lisp_equal(void *n1, void *n2); 172 void lprint(void *i);173 191 void *eval(void *prog); 174 192 void *eval_block(void *list); … … 181 199 182 200 void push_onto_list(void *object, void *&list); 183 LSymbol *add_c_object(void *symbol, int 16_t number);201 LSymbol *add_c_object(void *symbol, int index); 184 202 LSymbol *add_c_function(char const *name, short min_args, short max_args, short number); 185 203 LSymbol *add_c_bool_fun(char const *name, short min_args, short max_args, short number); … … 189 207 190 208 191 LPointer *new_lisp_pointer(void *addr);192 LChar *new_lisp_character(uint16_t ch);193 LFixedPoint *new_lisp_fixed_point(int32_t x);194 LObjectVar *new_lisp_object_var(int16_t number);195 209 LSysFunction *new_lisp_sys_function(int min_args, int max_args, int fun_number); 196 210 LSysFunction *new_lisp_c_function(int min_args, int max_args, int fun_number); … … 209 223 void lisp_init(long perm_size, long tmp_size); 210 224 void lisp_uninit(); 211 extern LSymbol *lsym_root;212 225 213 226 extern uint8_t *space[4], *free_space[4]; -
abuse/trunk/src/lisp/lisp_gc.cpp
r492 r493 88 88 static LArray *CollectArray(LArray *x) 89 89 { 90 size_t s = x-> size;90 size_t s = x->len; 91 91 LArray *a = LArray::Create(s, NULL); 92 92 LObject **src = x->GetData(); … … 110 110 x = (LList *)CDR(x); 111 111 ((LRedirect *)old_x)->type = L_COLLECTED_OBJECT; 112 ((LRedirect *)old_x)-> new_reference= p;112 ((LRedirect *)old_x)->ref = p; 113 113 114 114 p->car = CollectObject(old_car); … … 163 163 break; 164 164 case L_CHARACTER: 165 ret = new_lisp_character(lcharacter_value(x));165 ret = LChar::Create(lcharacter_value(x)); 166 166 break; 167 167 case L_C_FUNCTION: … … 181 181 break; 182 182 case L_POINTER: 183 ret = new_lisp_pointer(lpointer_value(x));183 ret = LPointer::Create(lpointer_value(x)); 184 184 break; 185 185 case L_1D_ARRAY: … … 187 187 break; 188 188 case L_FIXED_POINT: 189 ret = new_lisp_fixed_point(lfixed_point_value(x));189 ret = LFixedPoint::Create(lfixed_point_value(x)); 190 190 break; 191 191 case L_CONS_CELL: … … 193 193 break; 194 194 case L_OBJECT_VAR: 195 ret = new_lisp_object_var(((LObjectVar *)x)->number);195 ret = LObjectVar::Create(((LObjectVar *)x)->index); 196 196 break; 197 197 case L_COLLECTED_OBJECT: 198 ret = ((LRedirect *)x)-> new_reference;198 ret = ((LRedirect *)x)->ref; 199 199 break; 200 200 default: … … 206 206 } 207 207 ((LRedirect *)x)->type = L_COLLECTED_OBJECT; 208 ((LRedirect *)x)-> new_reference= ret;208 ((LRedirect *)x)->ref = ret; 209 209 } 210 210 else if ((uint8_t *)x < collected_start || (uint8_t *)x >= collected_end) … … 224 224 static void collect_symbols(LSymbol *root) 225 225 { 226 if (root) 227 { 226 if (!root) 227 return; 228 228 229 root->value = CollectObject(root->value); 229 230 root->function = CollectObject(root->function); … … 231 232 collect_symbols(root->left); 232 233 collect_symbols(root->right); 233 }234 234 } 235 235 … … 276 276 //dump_memory((char *)lsym_root->name, 128, 196); 277 277 //dump_memory((char *)0xb6782025, 32, 48); 278 collect_symbols( lsym_root);278 collect_symbols(LSymbol::root); 279 279 collect_stacks(); 280 280 -
abuse/trunk/src/menu.cpp
r492 r493 117 117 default : 118 118 { 119 lprint(arg);119 ((LObject *)arg)->Print(); 120 120 printf(" is not a valid menu option\n"); 121 121 exit(0); -
abuse/trunk/src/objects.cpp
r492 r493 495 495 frm = LList::Create(); 496 496 PtrRef r2(frm); 497 frm->car = new_lisp_pointer(from);497 frm->car = LPointer::Create(from); 498 498 499 499 hx = LList::Create(); … … 899 899 if (hit_object) 900 900 { 901 push_onto_list( new_lisp_pointer(hit_object),rlist);901 push_onto_list(LPointer::Create(hit_object),rlist); 902 902 push_onto_list(l_object,rlist); 903 903 } else … … 1247 1247 if (item_type(r)!=L_NUMBER) 1248 1248 { 1249 lprint(r);1249 ((LObject *)r)->Print(); 1250 1250 lbreak("Object %s did not return a number from its mover function!\n" 1251 1251 "It should return a number to indicate its blocked status to the\n" -
abuse/trunk/src/particle.cpp
r492 r493 64 64 if (item_type(sym)!=L_SYMBOL) 65 65 { 66 lprint(args);66 ((LObject *)args)->Print(); 67 67 printf("expecting first arg to def-particle to be a symbol!\n"); 68 68 exit(0); … … 89 89 { 90 90 delete fp; 91 lprint(args);91 ((LObject *)args)->Print(); 92 92 fprintf(stderr,"\nparticle sequence : Unable to open %s for reading\n",fn); 93 93 fprintf(stderr,"total files open=%d\n",total_files_open);
Note: See TracChangeset
for help on using the changeset viewer.