VALUE rb_struct_define_under(VALUE outer, const char *name, ...) { va_list ar; VALUE ary; char *mem; ary = rb_ary_tmp_new(0); va_start(ar, name); while ((mem = va_arg(ar, char*)) != 0) { ID slot = rb_intern(mem); rb_ary_push(ary, ID2SYM(slot)); } va_end(ar); return setup_struct(rb_define_class_under(outer, name, rb_cStruct), ary); }
VALUE rb_struct_define(const char *name, ...) { va_list ar; VALUE st, ary; char *mem; ary = rb_ary_tmp_new(0); va_start(ar, name); while ((mem = va_arg(ar, char*)) != 0) { ID slot = rb_intern(mem); rb_ary_push(ary, ID2SYM(slot)); } va_end(ar); if (!name) st = anonymous_struct(rb_cStruct); else st = new_struct(rb_str_new2(name), rb_cStruct); return setup_struct(st, ary); }
static VALUE rb_struct_s_def(int argc, VALUE *argv, VALUE klass) { VALUE name, rest; long i; VALUE st; ID id; rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS); name = argv[0]; if (SYMBOL_P(name)) { name = Qnil; } else { --argc; ++argv; } rest = rb_ary_tmp_new(argc); for (i=0; i<argc; i++) { id = rb_to_id(argv[i]); RARRAY_ASET(rest, i, ID2SYM(id)); rb_ary_set_len(rest, i+1); } if (NIL_P(name)) { st = anonymous_struct(klass); } else { st = new_struct(name, klass); } setup_struct(st, rest); if (rb_block_given_p()) { rb_mod_module_eval(0, 0, st); } return st; }
void main(int argc,char **argv) { int i,nowait=FALSE; setup_struct(); if(argc != 1) { for(i=1;i<argc;i++) { if(strcmp(argv[i],"-map") == 0) sm->mapdraw = TRUE; else if((strcmp(argv[i],"-server") == 0) || (strcmp(argv[i],"-s") == 0)) { i++; sm->sologame = FALSE; if(strlen(argv[i]) > 255) { fprintf(stderr,"Hostname too int!!\n"); exit(1); } strcpy(sm->hostname,argv[i]); } else if((strcmp(argv[i],"-help") == 0) || (strcmp(argv[i],"-h") == 0)) { usage(stdout); exit(0); } else if(strcmp(argv[i],"-name") == 0) { i++; if(strlen(argv[i]) >= MAXNAME) { fprintf(stderr,"Name too int. Maximum is %d character.\n",MAXNAME-1); exit(1); } strcpy(sm->ownname,argv[i]); } else if(strcmp(argv[i],"-tiny") == 0) sm->outputsize = 14; else if(strcmp(argv[i],"-small") == 0) sm->outputsize = 13; else if(strcmp(argv[i],"-huge") == 0) sm->outputsize = 11; else if(strcmp(argv[i],"-big") == 0) sm->outputsize = -1; else if(strcmp(argv[i],"-mono") == 0) sm->monomode = TRUE; else if((strcmp(argv[i],"-gray") == 0) || (strcmp(argv[i],"-grey") == 0)) sm->graymode = TRUE; else if(strcmp(argv[i],"-dither") == 0) sm->dithermode = TRUE; else if(strcmp(argv[i],"-nowait") == 0) nowait = TRUE; else if(strcmp(argv[i],"-camera") == 0) sm->camera = TRUE; else if(strcmp(argv[i],"-direct") == 0) sm->directdraw = TRUE; else if(strcmp(argv[i],"-sound") == 0) sm->usesound = TRUE; else if(!strcmp(argv[i],"-privatecmap")) sm->privatecmap = TRUE; else if(!strcmp(argv[i],"-noshmem")) sm->noshmem = TRUE; else if(!strcmp(argv[i],"-texture")) { sm->texturemode = TRUE; sm->privatecmap = TRUE; } else if(strcmp(argv[i],"-comment") == 0) { i++; if(strlen(argv[i]) >= MAXCOMMENT) { fprintf(stderr,"Comment too int. Maximum is %d character.\n",MAXCOMMENT-1); exit(1); } strcpy(sm->owncomment,argv[i]); } else { usage(stderr); exit(1); } } } #ifndef USE_SOUND if(sm->usesound) fprintf(stderr,"You haven't compiled netmaze with USE_SOUND.\n"); #endif if(sm->sologame && sm->usesound) { sm->usesound = FALSE; fprintf(stderr,"It's not possible to use sound in the solo testmode.\n"); } if( (sm->monomode + sm->graymode + sm->dithermode) > 2 ) { fprintf(stderr,"Sorry .. only -mono OR -gray OR -dither is allowed\n"); exit(1); } if( sm->texturemode && (sm->monomode || sm->graymode || sm->dithermode)) { fprintf(stderr,"Warning: Textures only usefull in colormode yet.\n"); } /* init Default-Maze */ create_maze(&(sm->std_maze)); /* Signals,Gfx,Network,(IPC:fork),keyboard initialisieren */ init_program(argc,argv); if(sm->sologame) { printf("Press '1' to start game!\n"); } else { printf("OK .. now wait for serverstart\n"); } /**** beginning of the mainloop (endless) ****/ while(!sm->exitprg) { int waitselect; #ifdef USE_IPC if(sm->sologame) x11_cntrl(); #else x11_cntrl(); #endif if(nowait) waitselect = FALSE; else waitselect = TRUE; if(sm->bgdraw) { draw_info(); sm->bgdraw = FALSE; x11_flush(); } if((sm->screendraw) && (sm->redraw)) { if(sm->drawwait >= DRAWWAIT) { sm->redraw = FALSE; sm->drawwait = 0; draw_screen(); waitselect = FALSE; } } if((sm->winnerdraw) && (sm->redraw)) { sm->redraw = FALSE; draw_end(sm->playfeld,sm->winner); /* does XSync() */ } if((sm->statchg2) && (!sm->gameflag)) /*update Screen after the Gameover*/ { sm->statchg = TRUE; sm->statchg2 = FALSE; draw_status(-1,sm->playfeld); x11_flush(); } if((sm->killchg) && (!sm->gameflag)) /*update Screen after the Gameover*/ { draw_kills(sm->shownumber,sm->playfeld); x11_flush(); } if(waitselect) /* test! only a timeout-wait yet */ { /* this reduces the load enormous :) */ struct timeval timeout; #ifdef USE_IPC if(sm->gameflag) { timeout.tv_sec = 0; timeout.tv_usec = 1000; /* lower than the minval on most machines */ } else { #endif timeout.tv_sec = 0; /* in NON-IPC versions, the SIGIO-Signal */ timeout.tv_usec = 100000; /* also exits the select-command */ #ifdef USE_IPC } #endif select(0,NULL,NULL,NULL,&timeout); } } XCloseDisplay(sm->grafix.display); }