static Key * parsechain(const char *s, const char *e, Key *spec) { const char *p, *q; Key *chain = NULL, *last = NULL; XPRINTF("Parsing chain from: '%s'\n", s); for (p = s; p < e; p = (*q == ':' ? q + 1 : q)) { Key *k; for (q = p; q < e && (isalnum(*q) || isblank(*q) || *q == '_' || *q == '+'); q++) ; if (q < e && *q != ':') q = e; k = ecalloc(1, sizeof(*k)); *k = *spec; if (!parsekey(p, q, k)) { freekey(k); freechain(chain); chain = last = NULL; break; } chain = chain ? : k; if (last) { last->func = &k_chain; last->chain = k; } last = k; } if (chain) XPRINTF("Parsed chain: %s\n", showchain(chain)); return chain; }
static tlHandle parse(tlBuffer* buf) { char c; do { c = tlBufferPeekByte(buf, 0); } while (c && c <= 32); trace("probing: %c", c); switch (c) { case '{': { tlBufferSkipByte(buf); trace("{"); tlHashMap* map = tlHashMapNew(); while (true) { tlHandle k = parsekey(buf); if (!k) break; do { c = tlBufferReadByte(buf); } while (c && c <= 32); if (c != '=') { warning("no '=' %c", c); return null; } tlHandle v = parse(buf); if (!v) { warning("no value"); return null; } tlHashMapSet(map, k, v); do { c = tlBufferReadByte(buf); } while (c && c <= 32); if (c != ',') { tlBufferRewind(buf, 1); break; } } c = tlBufferReadByte(buf); if (c != '}') { warning("no '}' %c", c); return null; } trace("}"); tlObject* res = tlHashMapToObject(map); trace("map: %d", tlObjectSize(res)); return res; } case '[': { tlBufferSkipByte(buf); trace("["); tlArray* ls = tlArrayNew(); while (true) { tlHandle h = parse(buf); if (!h) break; tlArrayAdd(ls, h); do { c = tlBufferReadByte(buf); } while (c && c <= 32); if (c != ',') { tlBufferRewind(buf, 1); break; } } c = tlBufferReadByte(buf); if (c != ']') { warning("no ']' %c", c); return null; } trace("]"); return tlArrayToList(ls); } case '"': case '\'': return parsestring(buf, c); case 'n': { tlBufferReadSkip(buf, 4); return tlNull; } case 'f': { tlBufferReadSkip(buf, 5); return tlFalse; } case 't': { tlBufferReadSkip(buf, 4); return tlTrue; } case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '-': case '+': case '.': return parsenum(buf); } warning("unparsable: %c", c); return null; }
static Key* getkey(const char *name) { Key *k, *r; char buf[128]; char *seq[8]; char *kstr; int mask; uint i, toks; static ushort id = 1; r = nil; if((k = name2key(name))) { ungrabkey(k); return k; } utflcpy(buf, name, sizeof buf); toks = tokenize(seq, 8, buf, ','); for(i = 0; i < toks; i++) { if(!k) r = k = emallocz(sizeof *k); else { k->next = emallocz(sizeof *k); k = k->next; } utflcpy(k->name, name, sizeof k->name); if(parsekey(seq[i], &mask, &kstr)) { k->key = keycode(kstr); k->mod = mask; } if(k->key == 0) { freekey(r); return nil; } } if(r) { r->id = id++; r->lnext = key; key = r; } return r; }
int RunControlSettings() { static int index = 0; static int spy = 72; int done = 0, y, i; int err = 1; int editMode = 0; g_dirty = 1; while (!done) { // Parse input readkey(); if (parsekey(DINGOO_SELECT)) { editMode = 1; DrawText(gui_screen, ">>", 185, spy); g_dirty = 0; } if (!editMode) { if (parsekey(DINGOO_A)) { if (index == 4) { cm_menu[index].update(g_key); } } if (parsekey(DINGOO_B)) { //ERROR CHECKING int iBtn1 = -1; int iBtn2 = -1; err = 1; for ( int i = 0; i < 4; i++ ) { for ( int y = 0; y < 4; y++ ) { g_config->getOption(cm_menu[i].option, &iBtn1); if (i != y) { g_config->getOption(cm_menu[y].option, &iBtn2); if (iBtn1 == iBtn2) { err = 0; g_dirty = 1; } } } } done= err; } } if ( !editMode ) { if (parsekey(DINGOO_UP, 1)) { if (index > 0) { index--; spy -= 15; } else { index = CONTROL_MENUSIZE - 1; spy = 72 + 15*index; } } if (parsekey(DINGOO_DOWN, 1)) { if (index < CONTROL_MENUSIZE - 1) { index++; spy += 15; } else { index = 0; spy = 72; } } } if ( editMode ) { if (parsekey(DINGOO_A, 0) || parsekey(DINGOO_B, 0) || parsekey(DINGOO_X, 0) || parsekey(DINGOO_Y, 0)) { cm_menu[index].update(g_key); g_dirty = 1; editMode = 0; } } // Draw stuff if( g_dirty ) { draw_bg(g_bg); //Draw Top and Bottom Bars DrawChar(gui_screen, SP_SELECTOR, 0, 37); DrawChar(gui_screen, SP_SELECTOR, 81, 37); DrawChar(gui_screen, SP_SELECTOR, 0, 225); DrawChar(gui_screen, SP_SELECTOR, 81, 225); DrawText(gui_screen, "B - Go Back", 235, 225); DrawChar(gui_screen, SP_LOGO, 12, 9); // Draw selector DrawChar(gui_screen, SP_SELECTOR, 56, spy); DrawChar(gui_screen, SP_SELECTOR, 77, spy); if (err == 0) { DrawText(gui_screen, "!!!Error - Duplicate Key Mapping!!! ", 8, 37); } else { DrawText(gui_screen, "Control Settings - Press select to edit", 8, 37); } // Draw menu for(i=0,y=72;i < CONTROL_MENUSIZE;i++,y+=15) { int iBtnVal = -1; char cBtn[32]; DrawText(gui_screen, cm_menu[i].name, 60, y); g_config->getOption(cm_menu[i].option, &iBtnVal); if (i == CONTROL_MENUSIZE-1) sprintf(cBtn, "%s", ""); else if (iBtnVal == DefaultGamePad[0][0]) sprintf(cBtn, "%s", "GCW_A"); else if (iBtnVal == DefaultGamePad[0][1]) sprintf(cBtn, "%s", "GCW_B"); else if (iBtnVal == DefaultGamePad[0][8]) sprintf(cBtn, "%s", "GCW_Y"); else if (iBtnVal == DefaultGamePad[0][9]) sprintf(cBtn, "%s", "GCW_X"); else sprintf(cBtn, "%s", "<empty>"); DrawText(gui_screen, cBtn, 210, y); } // Draw info DrawText(gui_screen, cm_menu[index].info, 8, 225); g_dirty = 0; } SDL_Delay(16); // Update real screen FCEUGUI_Flip(); } // Clear screen dingoo_clear_video(); g_dirty = 1; return 0; }
static void set(char *t, NODE *ip) { int type; char *kw, *val = NULL; struct group *gr; struct passwd *pw; mode_t *m; int value; char *ep; for (; (kw = strtok(t, "= \t\n")); t = NULL) { ip->flags |= type = parsekey(kw, &value); if (value && (val = strtok(NULL, " \t\n")) == NULL) errx(1, "line %d: missing value", lineno); switch(type) { case F_CKSUM: ip->cksum = strtoul(val, &ep, 10); if (*ep) errx(1, "line %d: invalid checksum %s", lineno, val); break; case F_MD5: ip->md5digest = strdup(val); if(!ip->md5digest) { errx(1, "strdup"); } break; case F_SHA1: ip->sha1digest = strdup(val); if(!ip->sha1digest) { errx(1, "strdup"); } break; case F_RMD160: ip->rmd160digest = strdup(val); if(!ip->rmd160digest) { errx(1, "strdup"); } break; case F_FLAGS: if (strcmp("none", val) == 0) ip->st_flags = 0; else if (strtofflags(&val, &ip->st_flags, NULL) != 0) errx(1, "line %d: invalid flag %s",lineno, val); break; case F_GID: ip->st_gid = strtoul(val, &ep, 10); if (*ep) errx(1, "line %d: invalid gid %s", lineno, val); break; case F_GNAME: if ((gr = getgrnam(val)) == NULL) errx(1, "line %d: unknown group %s", lineno, val); ip->st_gid = gr->gr_gid; break; case F_IGN: /* just set flag bit */ break; case F_MODE: if ((m = setmode(val)) == NULL) errx(1, "line %d: invalid file mode %s", lineno, val); ip->st_mode = getmode(m, 0); free(m); break; case F_NLINK: ip->st_nlink = strtoul(val, &ep, 10); if (*ep) errx(1, "line %d: invalid link count %s", lineno, val); break; case F_SIZE: ip->st_size = strtoq(val, &ep, 10); if (*ep) errx(1, "line %d: invalid size %s", lineno, val); break; case F_SLINK: if ((ip->slink = strdup(val)) == NULL) errx(1, "strdup"); break; case F_TIME: ip->st_mtimespec.tv_sec = strtoul(val, &ep, 10); if (*ep != '.') errx(1, "line %d: invalid time %s", lineno, val); val = ep + 1; ip->st_mtimespec.tv_nsec = strtoul(val, &ep, 10); if (*ep) errx(1, "line %d: invalid time %s", lineno, val); break; case F_TYPE: switch(*val) { case 'b': if (!strcmp(val, "block")) ip->type = F_BLOCK; break; case 'c': if (!strcmp(val, "char")) ip->type = F_CHAR; break; case 'd': if (!strcmp(val, "dir")) ip->type = F_DIR; break; case 'f': if (!strcmp(val, "file")) ip->type = F_FILE; if (!strcmp(val, "fifo")) ip->type = F_FIFO; break; case 'l': if (!strcmp(val, "link")) ip->type = F_LINK; break; case 's': if (!strcmp(val, "socket")) ip->type = F_SOCK; break; default: errx(1, "line %d: unknown file type %s", lineno, val); } break; case F_UID: ip->st_uid = strtoul(val, &ep, 10); if (*ep) errx(1, "line %d: invalid uid %s", lineno, val); break; case F_UNAME: if ((pw = getpwnam(val)) == NULL) errx(1, "line %d: unknown user %s", lineno, val); ip->st_uid = pw->pw_uid; break; } } }
int RunSettingsMenu() { static int index = 0; static int spy = 72; int done = 0, y, i; g_dirty = 1; while (!done) { // Parse input readkey(); if (parsekey(DINGOO_B)) done = 1; if (parsekey(DINGOO_UP, 1)) { if (index > 0) { index--; spy -= 16; } else { index = 3; spy = 72 + 16*index; } } if (parsekey(DINGOO_DOWN, 1)) { if (index < 3) { index++; spy += 16; } else { index = 0; spy = 72; } } if (parsekey(DINGOO_A)) { done = settings_menu[index].command(); } // Must draw bg only when needed // Draw stuff if (g_dirty) { draw_bg(g_bg); //Draw Top and Bottom Bars DrawChar(gui_screen, SP_SELECTOR, 0, 37); DrawChar(gui_screen, SP_SELECTOR, 81, 37); DrawChar(gui_screen, SP_SELECTOR, 0, 225); DrawChar(gui_screen, SP_SELECTOR, 81, 225); DrawText(gui_screen, "B - Go Back", 235, 225); DrawChar(gui_screen, SP_LOGO, 12, 9); // Draw selector DrawChar(gui_screen, SP_SELECTOR, 56, spy); DrawChar(gui_screen, SP_SELECTOR, 77, spy); DrawText(gui_screen, "Settings", 8, 37); // Draw menu for (i = 0, y = 72; i < 4; i++, y += 16) { DrawText(gui_screen, settings_menu[i].name, 60, y); } // Draw info DrawText(gui_screen, settings_menu[index].info, 8, 225); g_dirty = 0; } SDL_Delay(16); // Update real screen FCEUGUI_Flip(); } // Must update emulation core and drivers UpdateEMUCore(g_config); FCEUD_DriverReset(); // Clear screen dingoo_clear_video(); g_dirty = 1; }
Node *evilloop (Node *pos) { cli_outfun = set_status; while (!quit_tines) { Tbinding *binding; ui_draw (pos, inputbuf, 0); binding = parsekey (ui_input (), ui_current_scope); do { switch (binding->action) { case ui_action_quit: remove_temp (&pos); quit_tines = 1; break; case ui_action_command: if(!string_isoneof(binding->action_param, no_remove_temp_commands)) remove_temp (&pos); pos = docmd (pos, binding->action_param); if(!string_isoneof(binding->action_param,keep_inputbuf)) inputbuf[0] = 0; break; case ui_action_top: remove_temp (&pos); inputbuf[0] = 0; pos = node_top (pos); break; case ui_action_bottom: remove_temp (&pos); inputbuf[0] = 0; pos = node_bottom (pos); break; case ui_action_up: if (!remove_temp (&pos)) { if(forced_up){ if (node_forced_up (pos)){ pos = node_forced_up (pos); } } else { if (node_up (pos)){ pos = node_up (pos); } } } inputbuf[0] = 0; break; case ui_action_down: if (!remove_temp (&pos)) { if(forced_down){ if(node_forced_down(pos)) pos = node_forced_down (pos); } else { if(node_down(pos)) pos = node_down (pos); } inputbuf[0] = 0; break; } case ui_action_pagedown: remove_temp (&pos); inputbuf[0] = 0; { int n; for (n = 0; n < tines_nodes_down; n++) if (node_down (pos)) { pos = node_down (pos); } } break; case ui_action_pageup: remove_temp (&pos); inputbuf[0] = 0; { int n; for (n = 0; n < tines_nodes_up; n++) if (node_up (pos)) pos = node_up (pos); } break; case ui_action_left: if (!remove_temp (&pos)) { if (node_left (pos)) pos = node_left (pos); } inputbuf[0] = 0; break; case ui_action_right: if (node_right (pos)) { pos = node_right (pos); } else { if (fixnullstring (node_get (pos, TEXT))[0]) { node_insert_right (pos); if (node_getflag (pos, F_temp)) node_setflag (pos, F_temp, 0); if (!strcmp(fixnullstring(node_get(pos,"type")),"todo")){ node_set (node_right (pos), "type","todo"); node_set (node_right (pos), "done","no"); } node_setflag (node_right (pos), F_temp, 1); pos = node_right (pos); } } inputbuf[0] = 0; break; case ui_action_complete: if (strcmp (inputbuf, fixnullstring (node_get (pos, TEXT))) == 0) { if (node_right (pos)) { pos = node_right (pos); } else { if (fixnullstring (node_get (pos, TEXT))[0]) { node_insert_right (pos); if (node_getflag (pos, F_temp)) node_setflag (pos, F_temp, 0); if (!strcmp(fixnullstring(node_get(pos,"type")),"todo")){ node_set (node_right (pos), "type","todo"); node_set (node_right (pos), "done","no"); } node_setflag (node_right (pos), F_temp, 1); pos = node_right (pos); } } inputbuf[0] = 0; } else { strcpy (inputbuf, fixnullstring (node_get (pos, TEXT))); } break; case ui_action_cancel: if (node_getflag (pos, F_temp)) { pos = node_remove (pos); } else { /*stop = ui_quit (pos); */ } inputbuf[0] = 0; break; case ui_action_backspace: if (!strlen (inputbuf)) { /*pos = ui_remove (pos); */ } else { inputbuf[strlen (inputbuf) - 1] = 0; if (node_getflag (pos, F_temp)) if (node_up (pos)) pos = node_remove (pos); } break; case ui_action_unbound: undefined_key (ui_scope_names[ui_current_scope], binding->key != 1000 ? binding->key : *((int *) &binding-> action_param[0])); case ui_action_ignore: break; default: if (binding->action > 31 && binding->action < 255) { /* input for buffer */ inputbuf[strlen (inputbuf) + 1] = 0; inputbuf[strlen (inputbuf)] = binding->action; } else undefined_key (ui_scope_names[ui_current_scope], binding->key != 1000 ? binding-> key : *((int *) &binding-> action_param[0])); break; } } while ((++binding)->key == 999); if (strlen (inputbuf)) { if (node_getflag (pos, F_temp)) { node_set (pos, TEXT, inputbuf); } else { if (node_match (inputbuf, pos)) { pos = node_match (inputbuf, pos); } else { if (add_at_top) { pos = node_insert_up (node_top (pos)); } else { pos = node_insert_down (node_bottom (pos)); } node_setflag (pos, F_temp, 1); node_set (pos, TEXT, inputbuf); if (node_left (pos)) if (!strcmp(fixnullstring(node_get(node_left(pos),"type")),"todo")){ node_set (pos, "type","todo"); node_set (pos, "done","no"); } } } } else { docmd(pos, "autosave_check_timeout"); } } return pos; }
int main(int argc, char **argv) { int ch, status; unsigned int i; int cflag, Cflag, Dflag, Uflag, wflag; char *dir, *p; FILE *spec1, *spec2; setprogname(argv[0]); cflag = Cflag = Dflag = Uflag = wflag = 0; dir = NULL; init_excludes(); spec1 = stdin; spec2 = NULL; while ((ch = getopt(argc, argv, "bcCdDeE:f:F:I:ijk:K:lLmMnN:O:p:PqrR:s:StuUwWxX:")) != -1) { switch((char)ch) { case 'b': bflag = 1; break; case 'c': cflag = 1; break; case 'C': Cflag = 1; break; case 'd': dflag = 1; break; case 'D': Dflag = 1; break; case 'E': parsetags(&excludetags, optarg); break; case 'e': eflag = 1; break; case 'f': if (spec1 == stdin) { spec1 = fopen(optarg, "r"); if (spec1 == NULL) mtree_err("%s: %s", optarg, strerror(errno)); } else if (spec2 == NULL) { spec2 = fopen(optarg, "r"); if (spec2 == NULL) mtree_err("%s: %s", optarg, strerror(errno)); } else usage(); break; case 'F': for (i = 0; i < __arraycount(flavors); i++) if (strcmp(optarg, flavors[i].name) == 0) { flavor = flavors[i].flavor; break; } if (i == __arraycount(flavors)) usage(); break; case 'i': iflag = 1; break; case 'I': parsetags(&includetags, optarg); break; case 'j': jflag = 1; break; case 'k': keys = F_TYPE; while ((p = strsep(&optarg, " \t,")) != NULL) if (*p != '\0') keys |= parsekey(p, NULL); break; case 'K': while ((p = strsep(&optarg, " \t,")) != NULL) if (*p != '\0') keys |= parsekey(p, NULL); break; case 'l': lflag = 1; break; case 'L': ftsoptions &= ~FTS_PHYSICAL; ftsoptions |= FTS_LOGICAL; break; case 'm': mflag = 1; break; case 'M': mtree_Mflag = 1; break; case 'n': nflag = 1; break; case 'N': if (! setup_getid(optarg)) mtree_err( "Unable to use user and group databases in `%s'", optarg); break; case 'O': load_only(optarg); break; case 'p': dir = optarg; break; case 'P': ftsoptions &= ~FTS_LOGICAL; ftsoptions |= FTS_PHYSICAL; break; case 'q': qflag = 1; break; case 'r': rflag++; break; case 'R': while ((p = strsep(&optarg, " \t,")) != NULL) if (*p != '\0') keys &= ~parsekey(p, NULL); break; case 's': sflag = 1; crc_total = ~strtol(optarg, &p, 0); if (*p) mtree_err("illegal seed value -- %s", optarg); break; case 'S': mtree_Sflag = 1; break; case 't': tflag = 1; break; case 'u': uflag = 1; break; case 'U': Uflag = uflag = 1; break; case 'w': wflag = 1; break; case 'W': mtree_Wflag = 1; break; case 'x': ftsoptions |= FTS_XDEV; break; case 'X': read_excludes_file(optarg); break; case '?': default: usage(); } } argc -= optind; argv += optind; if (argc) usage(); switch (flavor) { case F_FREEBSD9: if (cflag && iflag) { warnx("-c and -i passed, replacing -i with -j for " "FreeBSD compatibility"); iflag = 0; jflag = 1; } if (dflag && !bflag) { warnx("Adding -b to -d for FreeBSD compatibility"); bflag = 1; } if (uflag && !iflag) { warnx("Adding -i to -%c for FreeBSD compatibility", Uflag ? 'U' : 'u'); iflag = 1; } if (uflag && !tflag) { warnx("Adding -t to -%c for FreeBSD compatibility", Uflag ? 'U' : 'u'); tflag = 1; } if (wflag) warnx("The -w flag is a no-op"); break; default: if (wflag) usage(); } if (spec2 && (cflag || Cflag || Dflag)) mtree_err("Double -f, -c, -C and -D flags are mutually " "exclusive"); if (dir && spec2) mtree_err("Double -f and -p flags are mutually exclusive"); if (dir && chdir(dir)) mtree_err("%s: %s", dir, strerror(errno)); if ((cflag || sflag) && !getcwd(fullpath, sizeof(fullpath))) mtree_err("%s", strerror(errno)); if ((cflag && Cflag) || (cflag && Dflag) || (Cflag && Dflag)) mtree_err("-c, -C and -D flags are mutually exclusive"); if (iflag && mflag) mtree_err("-i and -m flags are mutually exclusive"); if (lflag && uflag) mtree_err("-l and -u flags are mutually exclusive"); if (cflag) { cwalk(stdout); exit(0); } if (Cflag || Dflag) { dump_nodes(stdout, "", spec(spec1), Dflag); exit(0); } if (spec2 != NULL) status = mtree_specspec(spec1, spec2); else status = verify(spec1); if (Uflag && (status == MISMATCHEXIT)) status = 0; exit(status); }
int RunFileBrowser(char *source, char *outname, const char *types[], const char *info) { int size = 0; int index; int offset_start, offset_end; static int max_entries = 8; int scrollModifier = 4; int justsavedromdir = 0; int scrollMult; static int spy; int y, i; // Try to get a saved romdir from a config file char* home = getenv("HOME"); char romcfgfile [128]; sprintf (romcfgfile, "%s/.fceux/romdir.cfg", home); FILE * pFile; pFile = fopen (romcfgfile,"r+"); if (pFile != NULL) { fgets (s_LastDir , 128 , pFile); fclose (pFile); } // Create file list FileList *list = new FileList(source ? source : s_LastDir, types); if (list == NULL) return 0; scrollModifier *= max_entries; RESTART: spy = 72; size = list->Size(); index = 0; offset_start = 0; offset_end = size > max_entries ? max_entries : size; g_dirty = 1; while (1) { // Parse input readkey(); // TODO - put exit keys // Go to previous folder or return ... if (parsekey(DINGOO_B)) { list->Enter(-1); goto RESTART; } // Enter folder or select rom ... if (parsekey(DINGOO_A)) { if (list->GetSize(index) == -1) { list->Enter(index); goto RESTART; } else { strncpy(outname, list->GetPath(index), 128); break; } } if (parsekey(DINGOO_X)) { return 0; } if (parsekey(DINGOO_SELECT)) { // Save the current romdir in a config file char* home = getenv("HOME"); char romcfgfile [128]; strncpy(s_LastDir, list->GetCurDir(), 128); sprintf (romcfgfile, "%s/.fceux/romdir.cfg", home); FILE * pFile; pFile = fopen (romcfgfile,"w+"); fputs (s_LastDir,pFile); fclose (pFile); justsavedromdir = 1; } if (size > 0) { // Move through file list if (parsekey(DINGOO_R, 0)) { index = size - 1; spy = 72 + 15*(max_entries-1); offset_end = size; offset_start = offset_end - max_entries; } if (parsekey(DINGOO_L, 0)) { goto RESTART; } if (parsekey(DINGOO_UP, 1)) { if (index > offset_start){ index--; spy -= 15; } else if (offset_start > 0) { index--; offset_start--; offset_end--; } else { index = size - 1; offset_end = size; offset_start = size <= max_entries ? 0 : offset_end - max_entries; spy = 72 + 15*(index - offset_start); } } if (parsekey(DINGOO_DOWN, 1)) { if (index < offset_end - 1){ index++; spy += 15; } else if (offset_end < size) { index++; offset_start++; offset_end++; } else { index = 0; offset_start = 0; offset_end = size <= max_entries ? size : max_entries; spy = 72; } } if (parsekey(DINGOO_LEFT, 1)) { if (index > offset_start) { index = offset_start; spy = 72; } else if (index - scrollModifier >= 0){ index -= scrollModifier; offset_start -= scrollModifier; offset_end = offset_start + max_entries; } else goto RESTART; } if (parsekey(DINGOO_RIGHT, 1)) { if (index < offset_end-1) { index = offset_end-1; spy = 72 + 15*(index-offset_start); } else if (offset_end + scrollModifier <= size) { index += scrollModifier; offset_end += scrollModifier; offset_start += scrollModifier; } else { index = size - 1; spy = 72 + 15*(max_entries-1); offset_end = size; offset_start = offset_end - max_entries; } } } // Draw stuff if (g_dirty) { draw_bg(g_bg); //Draw Top and Bottom Bars DrawChar(gui_screen, SP_SELECTOR, 0, 37); DrawChar(gui_screen, SP_SELECTOR, 81, 37); DrawChar(gui_screen, SP_SELECTOR, 0, 225); DrawChar(gui_screen, SP_SELECTOR, 81, 225); DrawText(gui_screen, "B - Go Back", 235, 225); DrawChar(gui_screen, SP_LOGO, 12, 9); // Draw selector DrawChar(gui_screen, SP_SELECTOR, 4, spy); DrawChar(gui_screen, SP_SELECTOR, 81, spy); DrawText(gui_screen, "ROM Browser", 8, 37); // Draw file list for (i = offset_start, y = 72; i < offset_end; i++, y += 15) { DrawText(gui_screen, list->GetName(i), 8, y); } // Draw info if (info) DrawText(gui_screen, info, 8, 225); else { if (justsavedromdir == 1){ DrawText(gui_screen, "ROM dir successfully saved!", 8, 225); } else { if (list->GetSize(index) == -1) DrawText(gui_screen, "SELECT - Save ROM dir", 8, 225); else DrawText(gui_screen, "SELECT - Save ROM dir", 8, 225); } justsavedromdir = 0; } // Draw offset marks if (offset_start > 0) DrawChar(gui_screen, SP_UPARROW, 157, 57); if (offset_end < list->Size()) DrawChar(gui_screen, SP_DOWNARROW, 157, 197); g_dirty = 0; } SDL_Delay(4); // Update real screen FCEUGUI_Flip(); } if (source == NULL) strncpy(s_LastDir, list->GetCurDir(), 128); delete list; return 1; }
int RunMainSettings() { static int index = 0; static int spy = 74; int done = 0, y, i; int max_entries = 8; #ifdef FRAMESKIP int menu_size = 12; #else int menu_size = 11; #endif static int offset_start = 0; static int offset_end = menu_size > max_entries ? max_entries : menu_size; char tmp[32]; int itmp; g_dirty = 1; while (!done) { // Get time and battery every second if (update_time()) { update_battery(); g_dirty = 1; } // Parse input readkey(); if (parsekey(DINGOO_B)) done = 1; if (parsekey(DINGOO_UP, 1)) { if (index > 0) { index--; if (index >= offset_start) spy -= 15; if ((offset_start > 0) && (index < offset_start)) { offset_start--; offset_end--; } } } if (parsekey(DINGOO_DOWN, 1)) { if (index < (menu_size-1)) { index++; if (index < offset_end) spy += 15; if ((offset_end < menu_size) && (index >= offset_end)) { offset_end++; offset_start++; } } } if (parsekey(DINGOO_LEFT, 1) || parsekey(DINGOO_RIGHT, 1) || parsekey(DINGOO_A)) st_menu[index].update(g_key); // Draw stuff if( g_dirty ) { draw_bg(vbuffer, g_bg); DrawChar(vbuffer, SP_MAIN_SETTINGS, 40, 38); // Draw time and battery every minute DrawText(vbuffer, g_time, 148, 5); DrawText(vbuffer, g_battery, 214, 5); // Draw menu for(i=offset_start,y=70;i < offset_end;i++,y+=15) { DrawText(vbuffer, st_menu[i].name, 60, y); g_config->getOption(st_menu[i].option, &itmp); #ifdef FRACTIONAL_FRAMESKIP if (!strncmp(st_menu[i].name, "Frameskip", 8)) { int j; if (itmp > 3) itmp = 3; for (j=0;j<4;j++) if (itmp == frame_tag[j].val) break; strcpy(tmp, frame_tag[j].str); } else #endif if (!strncmp(st_menu[i].name, "Custom palette", 6)) { std::string palname; g_config->getOption(st_menu[i].option, &palname); // Remove path of string const int sz = static_cast<int>(palname.size()); const int path_sz = palname.rfind("/",palname.size()); if (path_sz == sz) strncpy(tmp, palname.c_str(), 32); else strncpy(tmp, palname.substr(path_sz + 1,sz - 1 - path_sz).c_str(), 32); } else sprintf(tmp, "%d", itmp); DrawText(vbuffer, tmp, 210, y); } // Draw info DrawText(vbuffer, st_menu[index].info, 16, 225); // Draw selector DrawChar(vbuffer, SP_SELECTOR, 44, spy); // Draw offset marks if (offset_start > 0 ) DrawChar(vbuffer, SP_UPARROW, 274, 62); if (offset_end < menu_size) DrawChar(vbuffer, SP_DOWNARROW, 274, 203); g_dirty = 0; } dingoo_timer_delay(16); // Update real screen memcpy(dingoo_screen15, vbuffer, 320*240*sizeof(unsigned short)); } g_dirty = 1; return 0; }
int main(int argc, char *argv[]) { extern int optind; extern char *optarg; int ch; char *dir, *p; int status; dir = NULL; keys = KEYDEFAULT; while ((ch = getopt(argc, argv, "cdef:iK:k:lnp:qrs:tUux")) != -1) switch(ch) { case 'c': cflag = 1; break; case 'd': dflag = 1; break; case 'e': eflag = 1; break; case 'f': if (!(freopen(optarg, "r", stdin))) error("%s: %s", optarg, strerror(errno)); break; case 'i': iflag = 1; break; case 'K': while ((p = strsep(&optarg, " \t,")) != NULL) if (*p != '\0') keys |= parsekey(p, NULL); break; case 'k': keys = F_TYPE; while ((p = strsep(&optarg, " \t,")) != NULL) if (*p != '\0') keys |= parsekey(p, NULL); break; case 'l': lflag = 1; break; case 'n': nflag = 1; break; case 'p': dir = optarg; break; case 'q': qflag = 1; break; case 'r': rflag = 1; break; case 's': sflag = 1; crc_total = ~strtol(optarg, &p, 0); if (*p) error("illegal seed value -- %s", optarg); break; case 't': tflag = 1; break; case 'U': Uflag = 1; uflag = 1; break; case 'u': uflag = 1; break; case 'x': ftsoptions |= FTS_XDEV; break; case '?': default: usage(); } argc -= optind; argv += optind; if (argc) usage(); /* * If uflag is set we can't make any pledges because we must be able * to chown and place setugid bits. Make sure that we're pledged * when -c was specified. */ if (!uflag || cflag) { if (rflag && tflag) { if (pledge("stdio rpath cpath getpw fattr", NULL) == -1) err(1, "pledge"); } else if (rflag && !tflag) { if (pledge("stdio rpath cpath getpw", NULL) == -1) err(1, "pledge"); } else if (!rflag && tflag) { if (pledge("stdio rpath getpw fattr", NULL) == -1) err(1, "pledge"); } else { if (pledge("stdio rpath getpw", NULL) == -1) err(1, "pledge"); } } if (dir && chdir(dir)) error("%s: %s", dir, strerror(errno)); if ((cflag || sflag) && !getcwd(fullpath, sizeof fullpath)) error("getcwd: %s", strerror(errno)); if (lflag == 1 && uflag == 1) error("-l and -u flags are mutually exclusive"); if (cflag) { cwalk(); exit(0); } status = verify(); if (Uflag && (status == MISMATCHEXIT)) status = 0; exit(status); }
int RunSoundSettings() { static int index = 0; static int spy = 72; int done = 0, y, i; int max_entries = 8; int menu_size = 10; static int offset_start = 0; static int offset_end = menu_size > max_entries ? max_entries : menu_size; char tmp[32]; int itmp; g_dirty = 1; while (!done) { // Parse input readkey(); if (parsekey(DINGOO_B)) done = 1; if (parsekey(DINGOO_UP, 1)) { if (index > 0) { index--; if (index >= offset_start) spy -= 15; if ((offset_start > 0) && (index < offset_start)) { offset_start--; offset_end--; } } else { index = menu_size-1; offset_end = menu_size; offset_start = menu_size <= max_entries ? 0 : offset_end - max_entries; spy = 72 + 15*(index - offset_start); } } if (parsekey(DINGOO_DOWN, 1)) { if (index < (menu_size - 1)) { index++; if (index < offset_end) spy += 15; if ((offset_end < menu_size) && (index >= offset_end)) { offset_end++; offset_start++; } } else { index = 0; offset_start = 0; offset_end = menu_size <= max_entries ? menu_size : max_entries; spy = 72; } } if (parsekey(DINGOO_RIGHT, 1) || parsekey(DINGOO_LEFT, 1)) sd_menu[index].update(g_key); // Draw stuff if (g_dirty) { draw_bg(g_bg); //Draw Top and Bottom Bars DrawChar(gui_screen, SP_SELECTOR, 0, 37); DrawChar(gui_screen, SP_SELECTOR, 81, 37); DrawChar(gui_screen, SP_SELECTOR, 0, 225); DrawChar(gui_screen, SP_SELECTOR, 81, 225); DrawText(gui_screen, "B - Go Back", 235, 225); DrawChar(gui_screen, SP_LOGO, 12, 9); // Draw selector DrawChar(gui_screen, SP_SELECTOR, 56, spy); DrawChar(gui_screen, SP_SELECTOR, 77, spy); DrawText(gui_screen, "Sound Settings", 8, 37); // Draw menu for (i = offset_start, y = 72; i < offset_end; i++, y += 15) { DrawText(gui_screen, sd_menu[i].name, 60, y); g_config->getOption(sd_menu[i].option, &itmp); sprintf(tmp, "%d", itmp); DrawText(gui_screen, tmp, 210, y); } // Draw info DrawText(gui_screen, sd_menu[index].info, 8, 225); // Draw offset marks if (offset_start > 0) DrawChar(gui_screen, SP_UPARROW, 218, 57); if (offset_end < menu_size) DrawChar(gui_screen, SP_DOWNARROW, 218, 197); g_dirty = 0; } SDL_Delay(16); // Update real screen FCEUGUI_Flip(); } // Clear screen dingoo_clear_video(); g_dirty = 1; return 0; }
static void set(char *t, NODE *ip) { int type; char *kw, *val = NULL; struct group *gr; struct passwd *pw; void *m; int value; u_int32_t fset, fclr; char *ep; size_t len; for (; (kw = strtok(t, "= \t\n")); t = NULL) { ip->flags |= type = parsekey(kw, &value); if (value && (val = strtok(NULL, " \t\n")) == NULL) error("missing value"); switch(type) { case F_CKSUM: ip->cksum = strtoul(val, &ep, 10); if (*ep) error("invalid checksum %s", val); break; case F_MD5: ip->md5digest = strdup(val); if (!ip->md5digest) error("%s", strerror(errno)); break; case F_FLAGS: if (!strcmp(val, "none")) { ip->file_flags = 0; break; } if (strtofflags(&val, &fset, &fclr)) error("%s", strerror(errno)); ip->file_flags = fset; break; case F_GID: ip->st_gid = strtoul(val, &ep, 10); if (*ep) error("invalid gid %s", val); break; case F_GNAME: if ((gr = getgrnam(val)) == NULL) error("unknown group %s", val); ip->st_gid = gr->gr_gid; break; case F_IGN: /* just set flag bit */ break; case F_MODE: if ((m = setmode(val)) == NULL) error("invalid file mode %s", val); ip->st_mode = getmode(m, 0); free(m); break; case F_NLINK: ip->st_nlink = strtoul(val, &ep, 10); if (*ep) error("invalid link count %s", val); break; case F_RMD160: ip->rmd160digest = strdup(val); if (!ip->rmd160digest) error("%s", strerror(errno)); break; case F_SHA1: ip->sha1digest = strdup(val); if (!ip->sha1digest) error("%s", strerror(errno)); break; case F_SIZE: ip->st_size = strtouq(val, &ep, 10); if (*ep) error("invalid size %s", val); break; case F_SLINK: len = strlen(val) + 1; if ((ip->slink = malloc(len)) == NULL) error("%s", strerror(errno)); if (strunvis(ip->slink, val) == -1) { fprintf(stderr, "mtree: filename (%s) encoded incorrectly\n", val); strlcpy(ip->slink, val, len); } break; case F_TIME: ip->st_mtimespec.tv_sec = strtoul(val, &ep, 10); if (*ep != '.') error("invalid time %s", val); val = ep + 1; ip->st_mtimespec.tv_nsec = strtoul(val, &ep, 10); if (*ep) error("invalid time %s", val); break; case F_TYPE: switch(*val) { case 'b': if (!strcmp(val, "block")) ip->type = F_BLOCK; break; case 'c': if (!strcmp(val, "char")) ip->type = F_CHAR; break; case 'd': if (!strcmp(val, "dir")) ip->type = F_DIR; break; case 'f': if (!strcmp(val, "file")) ip->type = F_FILE; if (!strcmp(val, "fifo")) ip->type = F_FIFO; break; case 'l': if (!strcmp(val, "link")) ip->type = F_LINK; break; case 's': if (!strcmp(val, "socket")) ip->type = F_SOCK; break; default: error("unknown file type %s", val); } break; case F_UID: ip->st_uid = strtoul(val, &ep, 10); if (*ep) error("invalid uid %s", val); break; case F_UNAME: if ((pw = getpwnam(val)) == NULL) error("unknown user %s", val); ip->st_uid = pw->pw_uid; break; } } }
int RunSettingsMenu() { static int index = 0; static int spy = 80; int done = 0, y, i; g_dirty = 1; while (!done) { // Get time and battery every second if (update_time()) { update_battery(); g_dirty = 1; } // Parse input readkey(); if (parsekey(DINGOO_B)) done = 1; if (parsekey(DINGOO_UP, 1)) { if (index > 0) { index--; spy -= 16; } } if (parsekey(DINGOO_DOWN, 1)) { if (index < 3) { index++; spy += 16; } } if (parsekey(DINGOO_A)) { done = settings_menu[index].command(); } // Must draw bg only when needed // Draw stuff if( g_dirty ) { draw_bg(vbuffer, g_bg); // Draw time and battery every minute DrawText(vbuffer, g_time, 148, 5); DrawText(vbuffer, g_battery, 214, 5); DrawChar(vbuffer, SP_SETTINGS, 40, 38); // Draw menu for(i=0,y=76;i < 4;i++,y+=16) { DrawText(vbuffer, settings_menu[i].name, 50, y); } // Draw info DrawText(vbuffer, settings_menu[index].info, 16, 225); // Draw selector DrawChar(vbuffer, SP_SELECTOR, 34, spy); g_dirty = 0; } dingoo_timer_delay(16); // Update real screen memcpy(dingoo_screen15, vbuffer, 320*240*sizeof(unsigned short)); } // Must update emulation core and drivers UpdateEMUCore(g_config); FCEUD_DriverReset(); g_dirty = 1; }
time_t rfc822_parsedt(const char *rfcdt) { unsigned day=0, mon=0, year; int secs; int offset; time_t t; unsigned y; /* Ignore day of the week. Tolerate "Tue, 25 Feb 1997 ... " ** without the comma. Tolerate "Feb 25 1997 ...". */ while (!day || !mon) { if (!*rfcdt) return (0); if (isalpha((int)(unsigned char)*rfcdt)) { if (mon) return (0); mon=parsekey(&rfcdt, mnames); if (!mon) while (*rfcdt && isalpha((int)(unsigned char)*rfcdt)) ++rfcdt; continue; } if (isdigit((int)(unsigned char)*rfcdt)) { if (day) return (0); day=parsedig(&rfcdt); if (!day) return (0); continue; } ++rfcdt; } while (*rfcdt && isspace((int)(unsigned char)*rfcdt)) ++rfcdt; if (!isdigit((int)(unsigned char)*rfcdt)) return (0); year=parsedig(&rfcdt); if (year < 70) year += 2000; if (year < 100) year += 1900; while (*rfcdt && isspace((int)(unsigned char)*rfcdt)) ++rfcdt; if (day == 0 || mon == 0 || mon > 12 || day > mdays(mon,year)) return (0); secs=parsetime(&rfcdt); if (secs < 0) return (0); offset=0; /* RFC822 sez no parenthesis, but I've seen (EST) */ while ( *rfcdt ) { if (isalnum((int)(unsigned char)*rfcdt) || *rfcdt == '+' || *rfcdt == '-') break; ++rfcdt; } if (isalpha((int)(unsigned char)*rfcdt)) { int n=parsekey(&rfcdt, zonenames); if (n > 0) offset= zoneoffset[n-1]; } else { int sign=1; unsigned n; switch (*rfcdt) { case '-': sign= -1; case '+': ++rfcdt; } if (isdigit((int)(unsigned char)*rfcdt)) { n=parsedig(&rfcdt); if (n > 2359 || (n % 100) > 59) n=0; offset = sign * ( (n % 100) * 60 + n / 100 * 60 * 60); } } if (year < 1970) return (0); t=0; for (y=1970; y<year; y++) { if ( leap(y) ) { if (year-y >= 4) { y += 3; t += ( 365*3+366 ) * 24 * 60 * 60; continue; } t += 24 * 60 * 60; } t += 365 * 24 * 60 * 60; } for (y=1; y < mon; y++) t += mdays(y, year) * 24 * 60 * 60; return ( t + (day-1) * 24 * 60 * 60 + secs - offset ); }
int w_option(Ctlr* ctlr, char* buf, long n) { char *p; int i, r; Cmdbuf *cb; r = 0; cb = parsecmd(buf, n); if(cb->nf < 2) r = -1; else if(cistrcmp(cb->f[0], "essid") == 0){ if(cistrcmp(cb->f[1],"default") == 0) p = ""; else p = cb->f[1]; if(ctlr->ptype == WPTypeAdHoc){ memset(ctlr->netname, 0, sizeof(ctlr->netname)); strncpy(ctlr->netname, p, WNameLen-1); } else{ memset(ctlr->wantname, 0, sizeof(ctlr->wantname)); strncpy(ctlr->wantname, p, WNameLen-1); } } else if(cistrcmp(cb->f[0], "station") == 0){ memset(ctlr->nodename, 0, sizeof(ctlr->nodename)); strncpy(ctlr->nodename, cb->f[1], WNameLen-1); } else if(cistrcmp(cb->f[0], "channel") == 0){ if((i = atoi(cb->f[1])) >= 1 && i <= 16) ctlr->chan = i; else r = -1; } else if(cistrcmp(cb->f[0], "mode") == 0){ if(cistrcmp(cb->f[1], "managed") == 0) ctlr->ptype = WPTypeManaged; else if(cistrcmp(cb->f[1], "wds") == 0) ctlr->ptype = WPTypeWDS; else if(cistrcmp(cb->f[1], "adhoc") == 0) ctlr->ptype = WPTypeAdHoc; else if((i = atoi(cb->f[1])) >= 0 && i <= 3) ctlr->ptype = i; else r = -1; } else if(cistrcmp(cb->f[0], "ibss") == 0){ if(cistrcmp(cb->f[1], "on") == 0) ctlr->createibss = 1; else ctlr->createibss = 0; } else if(cistrcmp(cb->f[0], "crypt") == 0){ if(cistrcmp(cb->f[1], "off") == 0) ctlr->crypt = 0; else if(cistrcmp(cb->f[1], "on") == 0 && ctlr->hascrypt) ctlr->crypt = 1; else r = -1; } else if(cistrcmp(cb->f[0], "clear") == 0){ if(cistrcmp(cb->f[1], "on") == 0) ctlr->xclear = 0; else if(cistrcmp(cb->f[1], "off") == 0 && ctlr->hascrypt) ctlr->xclear = 1; else r = -1; } else if(cistrncmp(cb->f[0], "key", 3) == 0){ if((i = atoi(cb->f[0]+3)) >= 1 && i <= WNKeys){ ctlr->txkey = i-1; if(parsekey(&ctlr->keys.keys[ctlr->txkey], cb->f[1])) r = -1; } else r = -1; } else if(cistrcmp(cb->f[0], "txkey") == 0){ if((i = atoi(cb->f[1])) >= 1 && i <= WNKeys) ctlr->txkey = i-1; else r = -1; } else if(cistrcmp(cb->f[0], "pm") == 0){ if(cistrcmp(cb->f[1], "off") == 0) ctlr->pmena = 0; else if(cistrcmp(cb->f[1], "on") == 0){ ctlr->pmena = 1; if(cb->nf == 3){ i = atoi(cb->f[2]); // check range here? what are the units? ctlr->pmwait = i; } } else r = -1; } else r = -2; free(cb); return r; }
int main(int argc, char *argv[]) { int ch; char *dir, *p; int status; FILE *spec1, *spec2; dir = NULL; keys = KEYDEFAULT; init_excludes(); spec1 = stdin; spec2 = NULL; while ((ch = getopt(argc, argv, "cdef:iK:k:LnPp:qrs:UuwxX:")) != -1) switch((char)ch) { case 'c': cflag = 1; break; case 'd': dflag = 1; break; case 'e': eflag = 1; break; case 'f': if (spec1 == stdin) { spec1 = fopen(optarg, "r"); if (spec1 == NULL) err(1, "%s", optarg); } else if (spec2 == NULL) { spec2 = fopen(optarg, "r"); if (spec2 == NULL) err(1, "%s", optarg); } else usage(); break; case 'i': iflag = 1; break; case 'K': while ((p = strsep(&optarg, " \t,")) != NULL) if (*p != '\0') keys |= parsekey(p, NULL); break; case 'k': keys = F_TYPE; while ((p = strsep(&optarg, " \t,")) != NULL) if (*p != '\0') keys |= parsekey(p, NULL); break; case 'L': ftsoptions &= ~FTS_PHYSICAL; ftsoptions |= FTS_LOGICAL; break; case 'n': nflag = 1; break; case 'P': ftsoptions &= ~FTS_LOGICAL; ftsoptions |= FTS_PHYSICAL; break; case 'p': dir = optarg; break; case 'q': qflag = 1; break; case 'r': rflag = 1; break; case 's': sflag = 1; crc_total = ~strtoul(optarg, &p, 0); if (*p) errx(1, "illegal seed value -- %s", optarg); break; case 'U': Uflag = 1; uflag = 1; break; case 'u': uflag = 1; break; case 'w': wflag = 1; break; case 'x': ftsoptions |= FTS_XDEV; break; case 'X': read_excludes_file(optarg); break; case '?': default: usage(); } argc -= optind; argv += optind; if (argc) usage(); if (dir && chdir(dir)) err(1, "%s", dir); if ((cflag || sflag) && !getcwd(fullpath, sizeof(fullpath))) errx(1, "%s", fullpath); if (cflag) { cwalk(); exit(0); } if (spec2 != NULL) status = mtree_specspec(spec1, spec2); else status = mtree_verifyspec(spec1); if (Uflag & (status == MISMATCHEXIT)) status = 0; exit(status); }
void FCEUGUI_Run() { static int index = 0; static int spy = 72; int done = 0, y, i; load_preview(); g_dirty = 1; while (!done) { // Parse input readkey(); if (parsekey(DINGOO_B)) done = 1; if (parsekey(DINGOO_UP, 1)) { if (index > 0) { index--; spy -= 16; } else { index = 7; spy = 72 + 16*index; } } if (parsekey(DINGOO_DOWN, 1)) { if (index < 7) { index++; spy += 16; } else { index = 0; spy = 72; } } if (parsekey(DINGOO_A)) { done = main_menu[index].command(); if(index == 3) load_preview(); } if (index == 3 || index == 4) { if (parsekey(DINGOO_RIGHT, 1)) { if (g_slot < 9) { g_slot++; FCEUI_SelectState(g_slot, 0); load_preview(); } } if (parsekey(DINGOO_LEFT, 1)) { if (g_slot > 0) { g_slot--; FCEUI_SelectState(g_slot, 0); load_preview(); } } } // Must draw bg only when needed // Draw stuff if (g_dirty) { draw_bg(g_bg); //Draw Top and Bottom Bars DrawChar(gui_screen, SP_SELECTOR, 0, 37); DrawChar(gui_screen, SP_SELECTOR, 81, 37); DrawChar(gui_screen, SP_SELECTOR, 0, 225); DrawChar(gui_screen, SP_SELECTOR, 81, 225); DrawText(gui_screen, "B - Go Back", 235, 225); DrawChar(gui_screen, SP_LOGO, 12, 9); // Draw selector DrawChar(gui_screen, SP_SELECTOR, 56, spy); DrawChar(gui_screen, SP_SELECTOR, 77, spy); if (index == 3 || index == 4) { // Draw state preview DrawChar(gui_screen, SP_PREVIEWBLOCK, 184, 73); draw_preview((unsigned short *)gui_screen->pixels, 185, 100); if (!g_ispreview) DrawChar(gui_screen, SP_NOPREVIEW, 207, 135); } if (index == 5) { DrawChar(gui_screen, SP_PREVIEWBLOCK, 184, 73); draw_shot_preview((unsigned short *)gui_screen->pixels, 185, 100); } DrawText(gui_screen, "Now Playing:", 8, 37); DrawText(gui_screen, g_romname, 96, 37); // Draw menu for (i = 0, y = 72; i < 8; i++, y += 16) { DrawText(gui_screen, main_menu[i].name, 60, y); } // Draw info DrawText(gui_screen, main_menu[index].info, 8, 225); // If save/load state render slot preview and number if (index == 3 || index == 4) { char tmp[32]; sprintf(tmp, "Slot %d", g_slot); DrawText(gui_screen, tmp, 212, 80); if (g_slot > 0) DrawChar(gui_screen, SP_LEFTARROW, 197, 83); if (g_slot < 9) DrawChar(gui_screen, SP_RIGHTARROW, 259, 83); } // If screenshot render current frame preview if (index == 5) { DrawText(gui_screen, "Preview", 207, 80); } g_dirty = 0; } SDL_Delay(16); // Update real screen FCEUGUI_Flip(); } g_psdl = FCEUD_GetPaletteArray16(); // Clear screen dingoo_clear_video(); }