struct cmd* parseexec(char **ps, char *es) { char *q, *eq; int tok, argc; struct execcmd *cmd; struct cmd *ret; if(peek(ps, es, "(")) return parseblock(ps, es); ret = execcmd(); cmd = (struct execcmd*)ret; argc = 0; ret = parseredirs(ret, ps, es); while(!peek(ps, es, "|)&;")){ if((tok=gettoken(ps, es, &q, &eq)) == 0) break; if(tok != 'a') panic("syntax"); cmd->argv[argc] = q; cmd->eargv[argc] = eq; argc++; if(argc >= MAXARGS) panic("too many args"); ret = parseredirs(ret, ps, es); } cmd->argv[argc] = 0; cmd->eargv[argc] = 0; return ret; }
remap_t* remap_loadmap( char *title) { char buf[160]; char fname[MAXPATHLEN]; char *home; int res; FILE *fp; block_t tmp; remap_t *map; memset(&tmp, 0, sizeof(tmp)); /* Build the map filename */ home = getenv("HOME"); if(!home) { fprintf(MSG_OUT, "libdvdnav: Unable to find home directory" ); return NULL; } snprintf(fname, sizeof(fname), "%s/.dvdnav/%s.map", home, title); /* Open the map file */ fp = fopen( fname, "r"); if (!fp) { fprintf(MSG_OUT, "libdvdnav: Unable to find map file '%s'\n", fname); return NULL; } /* Load the map file */ map = remap_new( title); while (fgets( buf, sizeof(buf), fp) != NULL) { if (buf[0] == '\n' || buf[0] == '#' || buf[0] == 0) continue; if (strncasecmp( buf, "debug", 5) == 0) { map->debug = 1; } else { res = parseblock( buf, &tmp.domain, &tmp.title, &tmp.program, &tmp.start_block, &tmp.end_block); if (res != 5) { fprintf(MSG_OUT, "libdvdnav: Ignoring map line (%d): %s\n", res, buf); continue; } remap_add_node( map, tmp); } } fclose(fp); if (map->nblocks == 0 && map->debug == 0) { free(map); return NULL; } return map; }