void pc_init(struct pcache *pc, size_t asiz, size_t pgsiz, uint hiwat, uint maxpools, struct memmgr *mm) { abort_unless(pc); abort_unless(asiz > 0); abort_unless(pgsiz == 0 || (pgsiz >= sizeof(union pc_pool_u) + pl_isiz(asiz, -1))); if ( pgsiz == 0 ) pgsiz = PC_DEF_SIZE; if ( !maxpools ) maxpools = ~0; pc->asiz = asiz + sizeof(cat_pcpad_t); pc->mm = mm; pc->pgsiz = pgsiz; pc->hiwat = hiwat; pc->maxpools = maxpools; pc->npools = 0; l_init(&pc->avail); l_init(&pc->empty); l_init(&pc->full); }
int main(int argc, char **argv) { ctx cctx; FILE *f; char *m = 0, *lft; long l, val; int c, ad = 1, i; v *cl = mkCons(0,0), *v, *n, *r; memset(&cctx, 0, sizeof(cctx)); if (argv[1] && (f = fopen(argv[1],"r"))) { fseek(f, 0, SEEK_END); l = ftell(f); fseek(f, 0, SEEK_SET); m = (char *)malloc(l+1); fread(m, 1, l, f); m[l] = 0; fclose(f); printf("%s", m); } v = scan(&cctx, m); print(&cctx, stderr, v ); printf("\n"); l_init(&cctx) ; evlist(&cctx, v, cctx.env); return 0; }
void init4sdl(struct world_t *world) { if(SDL_Init(SDL_INIT_EVERYTHING) < 0) { fatal("SDL init failed: %s", SDL_GetError()); } if(TTF_Init() < 0) { fatal("TTF init failed: %s", TTF_GetError()); } SDL_Window *window = NULL; SDL_Renderer *rend = NULL; window_width = 640; window_height = 480; window = SDL_CreateWindow(PROGRAM_NAME " - " VERSION_INFO, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, window_width, window_height, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE); rend = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); world->interface = &iface_sdl2; world->userdata = rend; world->camera.pos.x = -10; world->camera.pos.y = -10; l_init(world, window_width, window_height); atexit(SDL_Quit); }
bool handler__reset(globals_t * vars, char **argv, unsigned argc) { USEPARAMS(); if (vars->matches) { free(vars->matches); vars->matches = NULL; vars->num_matches = 0; } /* refresh list of regions */ l_destroy(vars->regions); /* create a new linked list of regions */ if ((vars->regions = l_init()) == NULL) { show_error("sorry, there was a problem allocating memory.\n"); return false; } /* read in maps if a pid is known */ if (vars->target && readmaps(vars->target, vars->regions) != true) { show_error("sorry, there was a problem getting a list of regions to search.\n"); show_warn("the pid may be invalid, or you don't have permission.\n"); vars->target = 0; return false; } return true; }
void cb_init(struct callback *cb, callback_f f, void *ctx) { abort_unless(cb); abort_unless(f); l_init(&cb->entry); cb->ctx = ctx; cb->func = f; }
static void init_allocator(struct entry_alloc *ea, struct entry_space *es, unsigned begin, unsigned end) { unsigned i; ea->es = es; ea->nr_allocated = 0u; ea->begin = begin; l_init(&ea->free); for (i = begin; i != end; i++) l_add_tail(ea->es, &ea->free, __get_entry(ea->es, i)); }
static void q_init(struct queue *q, struct entry_space *es, unsigned nr_levels) { unsigned i; q->es = es; q->nr_elts = 0; q->nr_levels = nr_levels; for (i = 0; i < q->nr_levels; i++) { l_init(q->qs + i); q->target_count[i] = 0u; } q->last_target_nr_elts = 0u; q->nr_top_levels = 0u; q->nr_in_top_levels = 0u; }
/* * Initialize Board struct. * * No error checks here, just zero the values. */ void sq0x88_board_init(Board * board) { int i; for (i = 0; i < 128; i++) { board->pieces[i] = NOPIECE; board->colors[i] = NOCOLOR; } board->turn = WHITE; board->castle = NOCASTLE; board->ep_square = NOSQUARE; board->king_square[WHITE] = NOSQUARE; board->king_square[BLACK] = NOSQUARE; board->material[0] = 0; board->material[1] = 0; board->ply_count = 0; board->ply_total = 0; for (i = 0; i < 6; i++) { board->piece_count[WHITE][i] = 0; board->piece_count[BLACK][i] = 0; } board->zhash_key = 0; /* Initiate other structures */ fl_init(&board->zhash_stack, freeKey); fl_init(&board->player_moves, freeMove); l_init(&board->player_pieces, freePiece); vectors_init(board); evalues_init(board); zobrist_init(&board->zob_container); return; }
int main(int argc, char **argv) { int n_listeners, i, clnt_length, clnt; struct pollfd *polls; LISTENER *lstn; pthread_t thr; pthread_attr_t attr; uid_t user_id; gid_t group_id; FILE *fpid; struct sockaddr_in clnt_addr; print_log = 0; #ifndef NO_SYSLOG openlog("pound", LOG_CONS, LOG_DAEMON); #endif logmsg(LOG_NOTICE, "starting..."); signal(SIGTERM, h_term); signal(SIGINT, h_term); signal(SIGQUIT, h_term); signal(SIGPIPE, SIG_IGN); srandom(getpid()); /* SSL stuff */ SSL_load_error_strings(); SSL_library_init(); OpenSSL_add_all_algorithms(); l_init(); CRYPTO_set_id_callback(l_id); CRYPTO_set_locking_callback(l_lock); init_RSAgen(); /* read config */ config_parse(argc, argv); /* prepare regular expressions */ if(regcomp(&HTTP, "^(GET|POST|HEAD) ([^ ]+) HTTP/1.[01]$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&XHTTP, "^(PUT|DELETE) ([^ ]+) HTTP/1.[01]$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) #ifdef MSDAV || regcomp(&WEBDAV, "^(LOCK|UNLOCK|SUBSCRIBE|PROPFIND|PROPPATCH|BPROPPATCH|SEARCH|POLL|MKCOL|MOVE|BMOVE|COPY|BCOPY|DELETE|BDELETE|CONNECT|OPTIONS|TRACE|MKACTIVITY|CHECKOUT|MERGE|REPORT) ([^ ]+) HTTP/1.[01]$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) #else || regcomp(&WEBDAV, "^(LOCK|UNLOCK) ([^ ]+) HTTP/1.[01]$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) #endif || regcomp(&HEADER, "^([a-z0-9!#$%&'*+.^_`|~-]+):[ \t]*(.*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&CHUNK_HEAD, "^([0-9a-f]+).*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&RESP_SKIP, "^HTTP/1.1 100.*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&RESP_IGN, "^HTTP/1.[01] (10[1-9]|1[1-9][0-9]|204|30[456]).*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&RESP_REDIR, "^HTTP/1.[01] 30[1237].*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&LOCATION, "(http|https)://([^/]+)/(.*)", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&AUTHORIZATION, "Authorization:[ \t]*Basic[ \t]*([^ \t]*)[ \t]*", REG_ICASE | REG_NEWLINE | REG_EXTENDED) ) { logmsg(LOG_ERR, "bad Regex - aborted"); exit(1); } /* open HTTP listeners */ for(lstn = listeners, n_listeners = 0; lstn; lstn = lstn->next, n_listeners++) { int opt; /* prepare the socket */ if((lstn->sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) { logmsg(LOG_ERR, "HTTP socket %s:%hd create: %s - aborted", inet_ntoa(lstn->addr.sin_addr), ntohs(lstn->addr.sin_port), strerror(errno)); exit(1); } opt = 1; setsockopt(lstn->sock, SOL_SOCKET, SO_REUSEADDR, (void *)&opt, sizeof(opt)); if(bind(lstn->sock, (struct sockaddr *)&lstn->addr, (socklen_t)sizeof(lstn->addr)) < 0) { logmsg(LOG_ERR, "HTTP socket bind %s:%hd: %s - aborted", inet_ntoa(lstn->addr.sin_addr), ntohs(lstn->addr.sin_port), strerror(errno)); exit(1); } listen(lstn->sock, 512); } /* alloc the poll structures */ if((polls = (struct pollfd *)calloc(n_listeners, sizeof(struct pollfd))) == NULL) { logmsg(LOG_ERR, "Out of memory for poll - aborted"); exit(1); } for(lstn = listeners, i = 0; lstn; lstn = lstn->next, i++) polls[i].fd = lstn->sock; /* set uid if necessary */ if(user) { struct passwd *pw; if((pw = getpwnam(user)) == NULL) { logmsg(LOG_ERR, "no such user %s - aborted", user); exit(1); } user_id = pw->pw_uid; } /* set gid if necessary */ if(group) { struct group *gr; if((gr = getgrnam(group)) == NULL) { logmsg(LOG_ERR, "no such group %s - aborted", group); exit(1); } group_id = gr->gr_gid; } /* Turn off verbose messages (if necessary) */ print_log = 0; #ifndef NO_SYSLOG close(0); close(1); close(2); #endif #ifdef HAVE_SETSID (void) setsid(); #endif /* record pid in file */ if((fpid = fopen(pid_name, "wt")) != NULL) { fprintf(fpid, "%d\n", getpid()); father = getpid(); fclose(fpid); } else logmsg(LOG_WARNING, "Create \"%s\": %s", pid_name, strerror(errno)); /* chroot if necessary */ if(root_jail) { if(chroot(root_jail)) { logmsg(LOG_ERR, "chroot: %s - aborted", strerror(errno)); exit(1); } if(chdir("/")) { logmsg(LOG_ERR, "chroot/chdir: %s - aborted", strerror(errno)); exit(1); } } if(group) if(setgid(group_id) || setegid(group_id)) { logmsg(LOG_ERR, "setgid: %s - aborted", strerror(errno)); exit(1); } if(user) if(setuid(user_id) || seteuid(user_id)) { logmsg(LOG_ERR, "setuid: %s - aborted", strerror(errno)); exit(1); } /* split off into monitor and working process if necessary */ for(;;) { #ifdef UPER if((son = fork()) > 0) { int status; while(wait(&status) != son) logmsg(LOG_ERR, "MONITOR: bad wait (%s)", strerror(errno)); if(WIFEXITED(status)) logmsg(LOG_ERR, "MONITOR: worker exited normally %d, restarting...", WEXITSTATUS(status)); else if(WIFSIGNALED(status)) logmsg(LOG_ERR, "MONITOR: worker exited on signal %d, restarting...", WTERMSIG(status)); else logmsg(LOG_ERR, "MONITOR: worker exited (stopped?) %d, restarting...", status); } else if (son == 0) { #endif /* thread stuff */ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); #ifdef NEED_STACK /* set new stack size - necessary for OpenBSD/FreeBSD and Linux NPTL */ if(pthread_attr_setstacksize(&attr, 1 << 18)) { logmsg(LOG_ERR, "can't set stack size - aborted"); exit(1); } #endif /* start resurector */ if(pthread_create(&thr, &attr, thr_resurect, NULL)) { logmsg(LOG_ERR, "create thr_resurect: %s - aborted", strerror(errno)); exit(1); } /* start the RSA stuff */ if(pthread_create(&thr, &attr, thr_RSAgen, NULL)) { logmsg(LOG_ERR, "create thr_RSAgen: %s - aborted", strerror(errno)); exit(1); } /* pause to make sure the service threads were started */ sleep(2); /* and start working */ for(;;) { for(i = 0; i < n_listeners; i++) { polls[i].events = POLLIN | POLLPRI; polls[i].revents = 0; } if(poll(polls, n_listeners, -1) < 0) { logmsg(LOG_WARNING, "poll: %s", strerror(errno)); } else { for(lstn = listeners, i = 0; lstn; lstn = lstn->next, i++) { if(polls[i].revents & (POLLIN | POLLPRI)) { memset(&clnt_addr, 0, sizeof(clnt_addr)); clnt_length = sizeof(clnt_addr); if((clnt = accept(lstn->sock, (struct sockaddr *)&clnt_addr, (socklen_t *)&clnt_length)) < 0) { logmsg(LOG_WARNING, "HTTP accept: %s", strerror(errno)); } else if (clnt_addr.sin_family != AF_INET) { /* may happen on FreeBSD, I am told */ logmsg(LOG_WARNING, "HTTP connection prematurely closed by peer"); close(clnt); } else { thr_arg *arg; if((arg = (thr_arg *)malloc(sizeof(thr_arg))) == NULL) { logmsg(LOG_WARNING, "HTTP arg: malloc"); close(clnt); } else { arg->sock = clnt; arg->lstn = lstn; arg->from_host = clnt_addr.sin_addr; if(pthread_create(&thr, &attr, thr_http, (void *)arg)) { logmsg(LOG_WARNING, "HTTP pthread_create: %s", strerror(errno)); free(arg); close(clnt); } } } } } } } #ifdef UPER } else { /* failed to spawn son */ logmsg(LOG_ERR, "Can't fork worker (%s) - aborted", strerror(errno)); exit(1); } #endif } }
int main(const int argc, char **argv) { int n_listeners, i, clnt_length, clnt; struct pollfd *polls; LISTENER *lstn; pthread_t thr; pthread_attr_t attr; struct sched_param sp; uid_t user_id; gid_t group_id; FILE *fpid; struct sockaddr_storage clnt_addr; char tmp[MAXBUF]; #ifndef SOL_TCP struct protoent *pe; #endif print_log = 0; (void)umask(077); control_sock = -1; log_facility = -1; logmsg(LOG_NOTICE, "starting..."); signal(SIGHUP, h_shut); signal(SIGINT, h_shut); signal(SIGTERM, h_term); signal(SIGQUIT, h_term); signal(SIGPIPE, SIG_IGN); srandom(getpid()); /* SSL stuff */ SSL_load_error_strings(); SSL_library_init(); OpenSSL_add_all_algorithms(); l_init(); init_thr_arg(); CRYPTO_set_id_callback(l_id); CRYPTO_set_locking_callback(l_lock); init_timer(); /* prepare regular expressions */ if(regcomp(&HEADER, "^([a-z0-9!#$%&'*+.^_`|~-]+):[ \t]*(.*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&CHUNK_HEAD, "^([0-9a-f]+).*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&RESP_SKIP, "^HTTP/1.1 100.*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&RESP_IGN, "^HTTP/1.[01] (10[1-9]|1[1-9][0-9]|204|30[456]).*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&LOCATION, "(http|https)://([^/]+)(.*)", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&AUTHORIZATION, "Authorization:[ \t]*Basic[ \t]*\"?([^ \t]*)\"?[ \t]*", REG_ICASE | REG_NEWLINE | REG_EXTENDED) ) { logmsg(LOG_ERR, "bad essential Regex - aborted"); exit(1); } #ifndef SOL_TCP /* for systems without the definition */ if((pe = getprotobyname("tcp")) == NULL) { logmsg(LOG_ERR, "missing TCP protocol"); exit(1); } SOL_TCP = pe->p_proto; #endif /* read config */ config_parse(argc, argv); if(log_facility != -1) openlog("pound", LOG_CONS | LOG_NDELAY, LOG_DAEMON); if(ctrl_name != NULL) { struct sockaddr_un ctrl; memset(&ctrl, 0, sizeof(ctrl)); ctrl.sun_family = AF_UNIX; strncpy(ctrl.sun_path, ctrl_name, sizeof(ctrl.sun_path) - 1); (void)unlink(ctrl.sun_path); if((control_sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) { logmsg(LOG_ERR, "Control \"%s\" create: %s", ctrl.sun_path, strerror(errno)); exit(1); } if(bind(control_sock, (struct sockaddr *)&ctrl, (socklen_t)sizeof(ctrl)) < 0) { logmsg(LOG_ERR, "Control \"%s\" bind: %s", ctrl.sun_path, strerror(errno)); exit(1); } listen(control_sock, 512); } /* open listeners */ for(lstn = listeners, n_listeners = 0; lstn; lstn = lstn->next, n_listeners++) { int opt; /* prepare the socket */ if((lstn->sock = socket(lstn->addr.ai_family == AF_INET? PF_INET: PF_INET6, SOCK_STREAM, 0)) < 0) { addr2str(tmp, MAXBUF - 1, &lstn->addr, 0); logmsg(LOG_ERR, "HTTP socket %s create: %s - aborted", tmp, strerror(errno)); exit(1); } opt = 1; setsockopt(lstn->sock, SOL_SOCKET, SO_REUSEADDR, (void *)&opt, sizeof(opt)); if(bind(lstn->sock, lstn->addr.ai_addr, (socklen_t)lstn->addr.ai_addrlen) < 0) { addr2str(tmp, MAXBUF - 1, &lstn->addr, 0); logmsg(LOG_ERR, "HTTP socket bind %s: %s - aborted", tmp, strerror(errno)); exit(1); } listen(lstn->sock, 512); } /* alloc the poll structures */ if((polls = (struct pollfd *)calloc(n_listeners, sizeof(struct pollfd))) == NULL) { logmsg(LOG_ERR, "Out of memory for poll - aborted"); exit(1); } for(lstn = listeners, i = 0; lstn; lstn = lstn->next, i++) polls[i].fd = lstn->sock; /* set uid if necessary */ if(user) { struct passwd *pw; if((pw = getpwnam(user)) == NULL) { logmsg(LOG_ERR, "no such user %s - aborted", user); exit(1); } user_id = pw->pw_uid; } /* set gid if necessary */ if(group) { struct group *gr; if((gr = getgrnam(group)) == NULL) { logmsg(LOG_ERR, "no such group %s - aborted", group); exit(1); } group_id = gr->gr_gid; } /* Turn off verbose messages (if necessary) */ print_log = 0; if(daemonize) { /* daemonize - make ourselves a subprocess. */ switch (fork()) { case 0: if(log_facility != -1) { close(0); close(1); close(2); } break; case -1: logmsg(LOG_ERR, "fork: %s - aborted", strerror(errno)); exit(1); default: exit(0); } #ifdef HAVE_SETSID (void) setsid(); #endif } /* record pid in file */ if((fpid = fopen(pid_name, "wt")) != NULL) { fprintf(fpid, "%d\n", getpid()); fclose(fpid); } else logmsg(LOG_NOTICE, "Create \"%s\": %s", pid_name, strerror(errno)); /* chroot if necessary */ if(root_jail) { if(chroot(root_jail)) { logmsg(LOG_ERR, "chroot: %s - aborted", strerror(errno)); exit(1); } if(chdir("/")) { logmsg(LOG_ERR, "chroot/chdir: %s - aborted", strerror(errno)); exit(1); } } if(group) if(setgid(group_id) || setegid(group_id)) { logmsg(LOG_ERR, "setgid: %s - aborted", strerror(errno)); exit(1); } if(user) if(setuid(user_id) || seteuid(user_id)) { logmsg(LOG_ERR, "setuid: %s - aborted", strerror(errno)); exit(1); } /* split off into monitor and working process if necessary */ for(;;) { #ifdef UPER if((son = fork()) > 0) { int status; (void)wait(&status); if(WIFEXITED(status)) logmsg(LOG_ERR, "MONITOR: worker exited normally %d, restarting...", WEXITSTATUS(status)); else if(WIFSIGNALED(status)) logmsg(LOG_ERR, "MONITOR: worker exited on signal %d, restarting...", WTERMSIG(status)); else logmsg(LOG_ERR, "MONITOR: worker exited (stopped?) %d, restarting...", status); } else if (son == 0) { #endif /* thread stuff */ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); #ifdef NEED_STACK /* set new stack size - necessary for OpenBSD/FreeBSD and Linux NPTL */ if(pthread_attr_setstacksize(&attr, 1 << 18)) { logmsg(LOG_ERR, "can't set stack size - aborted"); exit(1); } #endif /* start timer */ if(pthread_create(&thr, &attr, thr_timer, NULL)) { logmsg(LOG_ERR, "create thr_resurect: %s - aborted", strerror(errno)); exit(1); } /* start the controlling thread (if needed) */ if(control_sock >= 0 && pthread_create(&thr, &attr, thr_control, NULL)) { logmsg(LOG_ERR, "create thr_control: %s - aborted", strerror(errno)); exit(1); } /* pause to make sure the service threads were started */ sleep(1); /* create the worker threads */ for(i = 0; i < numthreads; i++) if(pthread_create(&thr, &attr, thr_http, NULL)) { logmsg(LOG_ERR, "create thr_http: %s - aborted", strerror(errno)); exit(1); } /* pause to make sure at least some of the worker threads were started */ sleep(1); /* and start working */ for(;;) { if(shut_down) { logmsg(LOG_NOTICE, "shutting down..."); for(lstn = listeners; lstn; lstn = lstn->next) close(lstn->sock); if(grace > 0) { sleep(grace); logmsg(LOG_NOTICE, "grace period expired - exiting..."); } if(ctrl_name != NULL) (void)unlink(ctrl_name); exit(0); } for(lstn = listeners, i = 0; i < n_listeners; lstn = lstn->next, i++) { polls[i].events = POLLIN | POLLPRI; polls[i].revents = 0; } if(poll(polls, n_listeners, -1) < 0) { logmsg(LOG_WARNING, "poll: %s", strerror(errno)); } else { for(lstn = listeners, i = 0; lstn; lstn = lstn->next, i++) { if(polls[i].revents & (POLLIN | POLLPRI)) { memset(&clnt_addr, 0, sizeof(clnt_addr)); clnt_length = sizeof(clnt_addr); if((clnt = accept(lstn->sock, (struct sockaddr *)&clnt_addr, (socklen_t *)&clnt_length)) < 0) { logmsg(LOG_WARNING, "HTTP accept: %s", strerror(errno)); } else if(((struct sockaddr_in *)&clnt_addr)->sin_family == AF_INET || ((struct sockaddr_in *)&clnt_addr)->sin_family == AF_INET6) { thr_arg arg; if(lstn->disabled) { /* addr2str(tmp, MAXBUF - 1, &clnt_addr, 1); logmsg(LOG_WARNING, "HTTP disabled listener from %s", tmp); */ close(clnt); } arg.sock = clnt; arg.lstn = lstn; if((arg.from_host.ai_addr = (struct sockaddr *)malloc(clnt_length)) == NULL) { logmsg(LOG_WARNING, "HTTP arg address: malloc"); close(clnt); continue; } memcpy(arg.from_host.ai_addr, &clnt_addr, clnt_length); arg.from_host.ai_addrlen = clnt_length; if(((struct sockaddr_in *)&clnt_addr)->sin_family == AF_INET) arg.from_host.ai_family = AF_INET; else arg.from_host.ai_family = AF_INET6; if(put_thr_arg(&arg)) close(clnt); } else { /* may happen on FreeBSD, I am told */ logmsg(LOG_WARNING, "HTTP connection prematurely closed by peer"); close(clnt); } } } } } #ifdef UPER } else { /* failed to spawn son */ logmsg(LOG_ERR, "Can't fork worker (%s) - aborted", strerror(errno)); exit(1); } #endif } }
int main(int argc,char *argv[]) { int er=1,i; signed char *s=NULL; char *tmpp; int mifiles = 5; int nifiles = 0; int verbose = 0; int oldfile = 0; int no_link = 0; char **ifiles; char *ofile; char *efile; char *lfile; char *ifile; char old_e[MAXLINE]; char old_l[MAXLINE]; char old_o[MAXLINE]; tim1=time(NULL); ncmos=0; n65816=0; cmosfl=1; w65816=0; /* default: 6502 only */ altppchar = '#' ; /* i.e., NO alternate char */ if((tmpp = strrchr(argv[0],'/'))) { tmpp++; } else { tmpp = argv[0]; } if( (!strcmp(tmpp,"xa65816")) || (!strcmp(tmpp,"XA65816")) || (!strcmp(tmpp,"xa816")) || (!strcmp(tmpp,"XA816")) ) { w65816 = 1; /* allow 65816 per default */ } /* default output charset for strings in quotes */ set_charset("ASCII"); ifiles = malloc(mifiles*sizeof(char*)); afile = alloc_file(); if (argc <= 1) { usage(w65816, stderr); exit(1); } if (strstr(argv[1], "--help")) { usage(w65816, stdout); exit(0); } if (strstr(argv[1], "--version")) { version(programname, progversion, authors, copyright); exit(0); } ofile="a.o65"; efile=NULL; lfile=NULL; if(pp_init()) { logout("fatal: pp: no memory!"); return 1; } if(b_init()) { logout("fatal: b: no memory!"); return 1; } if(l_init()) { logout("fatal: l: no memory!"); return 1; } i=1; while(i<argc) { if(argv[i][0]=='-') { switch(argv[i][1]) { case 'p': /* intentionally not allowing an argument to follow with a space to avoid - being seen as the alternate preprocessor char! */ if (argv[i][2] == '\0') { fprintf(stderr, "-p requires a character argument\n"); exit(1); } if (argv[i][2] == '#') fprintf(stderr, "using -p# is evidence of stupidity\n"); altppchar = argv[i][2]; if (argv[i][3] != '\0') fprintf(stderr, "warning: extra characters to -p ignored\n"); break; case 'M': masm = 1; /* MASM compatibility mode */ break; case 'O': /* output charset */ { char *name = NULL; if (argv[i][2] == 0) { name = argv[++i]; } else { name = argv[i]+2; } if (set_charset(name) < 0) { fprintf(stderr, "Output charset name '%s' unknown - ignoring! (check case?)\n", name); } } break; case 'A': /* make text segment start so that text relocation is not necessary when _file_ starts at adr */ romable = 2; if(argv[i][2]==0) romaddr = atoi(argv[++i]); else romaddr = atoi(argv[i]+2); break; case 'G': noglob = 1; break; case 'L': /* define global label */ if(argv[i][2]) lg_set(argv[i]+2); break; case 'r': crossref = 1; break; case 'R': relmode = 1; break; case 'D': s = (signed char*)strstr(argv[i]+2,"="); if(s) *s = ' '; pp_define(argv[i]+2); break; case 'c': no_link = 1; fmode |= FM_OBJ; break; case 'v': verbose = 1; break; case 'C': cmosfl = 0; break; case 'W': w65816 = 0; break; case 'w': w65816 = 1; break; case 'B': showblk = 1; break; case 'x': /* old filename behaviour */ oldfile = 1; fprintf(stderr, "Warning: -x is now deprecated and may disappear in future versions!\n"); break; case 'I': if(argv[i][2]==0) { reg_include(argv[++i]); } else { reg_include(argv[i]+2); } break; case 'o': if(argv[i][2]==0) { ofile=argv[++i]; } else { ofile=argv[i]+2; } break; case 'l': if(argv[i][2]==0) { lfile=argv[++i]; } else { lfile=argv[i]+2; } break; case 'e': if(argv[i][2]==0) { efile=argv[++i]; } else { efile=argv[i]+2; } break; case 'b': /* set segment base addresses */ switch(argv[i][2]) { case 't': if(argv[i][3]==0) tbase = atoi(argv[++i]); else tbase = atoi(argv[i]+3); break; case 'd': if(argv[i][3]==0) dbase = atoi(argv[++i]); else dbase = atoi(argv[i]+3); break; case 'b': if(argv[i][3]==0) bbase = atoi(argv[++i]); else bbase = atoi(argv[i]+3); break; case 'z': if(argv[i][3]==0) zbase = atoi(argv[++i]); else zbase = atoi(argv[i]+3); break; default: fprintf(stderr,"unknown segment type '%c' - ignoring!\n", argv[i][2]); break; } break; case 0: fprintf(stderr, "Single dash '-' on command line - ignoring!\n"); break; default: fprintf(stderr, "Unknown option '%c' - ignoring!\n",argv[i][1]); break; } } else { /* no option -> filename */ ifiles[nifiles++] = argv[i]; if(nifiles>=mifiles) { mifiles += 5; ifiles=realloc(ifiles, mifiles*sizeof(char*)); if(!ifiles) { fprintf(stderr, "Oops: couldn't alloc enough mem for filelist table..!\n"); exit(1); } } } i++; } if(!nifiles) { fprintf(stderr, "No input files given!\n"); exit(0); } if(oldfile) { strcpy(old_e, ifiles[0]); strcpy(old_o, ifiles[0]); strcpy(old_l, ifiles[0]); if(setfext(old_e,".err")==0) efile = old_e; if(setfext(old_o,".obj")==0) ofile = old_o; if(setfext(old_l,".lab")==0) lfile = old_l; } fplab= lfile ? xfopen(lfile,"w") : NULL; fperr= efile ? xfopen(efile,"w") : NULL; if(!strcmp(ofile,"-")) { ofile=NULL; fpout = stdout; } else { fpout= xfopen(ofile,"wb"); } if(!fpout) { fprintf(stderr, "Couldn't open output file!\n"); exit(1); } if(verbose) fprintf(stderr, "%s\n",copyright); if(1 /*!m_init()*/) { if(1 /*!b_init()*/) { if(1 /*!l_init()*/) { /*if(!pp_init())*/ { if(!x_init()) { if(fperr) fprintf(fperr,"%s\n",copyright); if(verbose) logout(ctime(&tim1)); /* Pass 1 */ pc[SEG_ABS]= 0; /* abs addressing */ seg_start(fmode, tbase, dbase, bbase, zbase, 0, relmode); if(relmode) { r_mode(RMODE_RELOC); segment = SEG_TEXT; } else { r_mode(RMODE_ABS); } nolink = no_link; for (i=0; i<nifiles; i++) { ifile = ifiles[i]; sprintf(out,"xAss65: Pass 1: %s\n",ifile); if(verbose) logout(out); er=pp_open(ifile); puttmp(0); puttmp(T_FILE); puttmp(0); puttmp(0); puttmps((signed char*)&ifile, sizeof(filep->fname)); if(!er) { er=pass1(); pp_close(); } else { sprintf(out, "Couldn't open source file '%s'!\n", ifile); logout(out); } } if((er=b_depth())) { sprintf(out,"Still %d blocks open at end of file!\n",er); logout(out); } if(tbase & (align-1)) { sprintf(out,"Warning: text segment ($%04x) start address doesn't align to %d!\n", tbase, align); logout(out); } if(dbase & (align-1)) { sprintf(out,"Warning: data segment ($%04x) start address doesn't align to %d!\n", dbase, align); logout(out); } if(bbase & (align-1)) { sprintf(out,"Warning: bss segment ($%04x) start address doesn't align to %d!\n", bbase, align); logout(out); } if(zbase & (align-1)) { sprintf(out,"Warning: zero segment ($%04x) start address doesn't align to %d!\n", zbase, align); logout(out); } if (n65816>0) fmode |= 0x8000; switch(align) { case 1: break; case 2: fmode |= 1; break; case 4: fmode |= 2; break; case 256: fmode |=3; break; } if((!er) && relmode) h_write(fpout, fmode, tlen, dlen, blen, zlen, 0); if(!er) { if(verbose) logout("xAss65: Pass 2:\n"); seg_pass2(); if(!relmode) { r_mode(RMODE_ABS); } else { r_mode(RMODE_RELOC); segment = SEG_TEXT; } er=pass2(); } if(fplab) printllist(fplab); tim2=time(NULL); if(verbose) printstat(); if((!er) && relmode) seg_end(fpout); /* write reloc/label info */ if(fperr) fclose(fperr); if(fplab) fclose(fplab); if(fpout) fclose(fpout); } else { logout("fatal: x: no memory!\n"); } pp_end(); /* } else { logout("fatal: pp: no memory!");*/ } } else { logout("fatal: l: no memory!\n"); } } else { logout("fatal: b: no memory!\n"); } /*m_exit();*/ } else { logout("Not enough memory available!\n"); } if(ner || er) { fprintf(stderr, "Break after %d error%c\n",ner,ner?'s':0); /*unlink();*/ if(ofile) { unlink(ofile); } } free(ifiles); return( (er || ner) ? 1 : 0 ); }
int main(int argc, char *argv[]) { struct dlist *node, list, *trav; struct list list2; cat_time_t ct; int arr1[] = { 10, 15, 5, 7, 12, 2, 7 }, arr2[] = { 9, 1, 6, 10, 6 }, s1 = sizeof(arr1) / sizeof(arr1[0]), s2 = sizeof(arr2) / sizeof(arr1[0]), i, j = 0; printf("Initial: "); for ( i = 0 ; i < s1 ; ++i ) printf("%u/%u ", ++j, arr1[i]); printf(" | "); for ( i = 0 ; i < s2 ; ++i ) printf("%u/%u ", ++j, arr2[i]); printf("\n"); j=0; dl_init(&list, tm_zero); for ( i = 0 ; i < s1 ; ++i ) { ++j; node = cdl_new(tm_lset(arr1[i], 0), int2ptr(j)); dl_ins(&list, node); } dl_first(&list, &ct); printf("The first is at %u\n", (uint)tm_sec(ct)); node = dl_deq(&list); printf("The first was %u at %u\n\n", (uint)ptr2uint(cdl_data(node)), (uint)tm_sec(node->ttl)); cdl_free(node); printf("Nodes from advance 10: "); l_init(&list2); dl_adv(&list, tm_lset(10, 0), &list2); while ( ! l_isempty(&list2) ) { trav = container(l_head(&list2), struct dlist, entry); printf("%u/%u ", (uint)ptr2uint(cdl_data(trav)), (uint)tm_sec(trav->ttl)); l_rem(&trav->entry); cdl_free(trav); } printf("\n\n"); for ( i = 0 ; i < s2 ; ++i ) { ++j; node = cdl_new(tm_lset(arr2[i], 0), int2ptr(j)); dl_ins(&list, node); } printf("After inserting arr2 array is :\n\t"); while ( node = dl_deq(&list) ) { printf("%u/", (uint)ptr2uint(cdl_data(node))); printf("%u ", (uint)tm_sec(node->ttl)); cdl_free(node); } printf("\n"); return 0; }
/* dregion [!][x][,x,...] */ bool handler__dregion(globals_t * vars, char **argv, unsigned argc) { unsigned id; bool invert = false; char *end = NULL, *idstr = NULL, *block = NULL; element_t *np, *pp; list_t *keep = NULL; region_t *save; /* need an argument */ if (argc < 2) { show_error("expected an argument, see `help dregion`.\n"); return false; } /* check that there is a process known */ if (vars->target == 0) { show_error("no target specified, see `help pid`\n"); return false; } /* check for an inverted match */ if (*argv[1] == '!') { invert = true; /* create a copy of the argument for strtok(), +1 to skip '!' */ block = strdupa(argv[1] + 1); /* check for lone '!' */ if (*block == '\0') { show_error("inverting an empty set, maybe try `reset` instead?\n"); return false; } /* create a list to keep the specified regions */ if ((keep = l_init()) == NULL) { show_error("memory allocation error.\n"); return false; } } else { invert = false; block = strdupa(argv[1]); } /* loop for every number specified, eg "1,2,3,4,5" */ while ((idstr = strtok(block, ",")) != NULL) { region_t *r = NULL; /* set block to NULL for strtok() */ block = NULL; /* attempt to parse as a regionid */ id = strtoul(idstr, &end, 0x00); /* check that worked, "1,abc,4,,5,6foo" */ if (*end != '\0' || *idstr == '\0') { show_error("could not parse argument %s.\n", idstr); if (invert) { if (l_concat(vars->regions, &keep) == -1) { show_error("there was a problem restoring saved regions.\n"); l_destroy(vars->regions); l_destroy(keep); return false; } } assert(keep == NULL); return false; } /* initialise list pointers */ np = vars->regions->head; pp = NULL; /* find the correct region node */ while (np) { r = np->data; /* compare the node id to the id the user specified */ if (r->id == id) break; pp = np; /* keep track of prev for l_remove() */ np = np->next; } /* check if a match was found */ if (np == NULL) { show_error("no region matching %u, or already moved.\n", id); if (invert) { if (l_concat(vars->regions, &keep) == -1) { show_error("there was a problem restoring saved regions.\n"); l_destroy(vars->regions); l_destroy(keep); return false; } } if (keep) l_destroy(keep); return false; } np = pp; /* save this region if the match is inverted */ if (invert) { assert(keep != NULL); l_remove(vars->regions, np, (void *) &save); if (l_append(keep, keep->tail, save) == -1) { show_error("sorry, there was an internal memory error.\n"); free(save); return false; } continue; } /* check for any affected matches before removing it */ if(vars->num_matches > 0) { region_t *s; /* determine the correct pointer we're supposed to be checking */ if (np) { assert(np->next); s = np->next->data; } else { /* head of list */ s = vars->regions->head->data; } if (!(vars->matches = delete_by_region(vars->matches, &vars->num_matches, s, false))) { show_error("memory allocation error while deleting matches\n"); } } l_remove(vars->regions, np, NULL); } if (invert) { region_t *s = keep->head->data; if (vars->num_matches > 0) { if (!(vars->matches = delete_by_region(vars->matches, &vars->num_matches, s, true))) { show_error("memory allocation error while deleting matches\n"); } } /* okay, done with the regions list */ l_destroy(vars->regions); /* and switch to the keep list */ vars->regions = keep; } return true; }