mloop() { while (!quit) { if (incmd) { docmd(); } else if (wwcurwin->ww_state != WWS_HASPROC) { if (!wwcurwin->ww_keepopen) closewin(wwcurwin); setcmd(1); if (wwpeekc() == escapec) (void) wwgetc(); error("Process died."); } else { register struct ww *w = wwcurwin; register char *p; register n; if (wwibp >= wwibq) wwiomux(); for (p = wwibp; p < wwibq && *p != escapec; p++) ; if ((n = p - wwibp) > 0) { if (!w->ww_ispty && w->ww_stopped) startwin(w); (void) write(w->ww_pty, wwibp, n); wwibp = p; } if (wwpeekc() == escapec) { (void) wwgetc(); setcmd(1); } } } }
/** * * @brief parse la chaine courante de l'interpreteur à la recherche d'une commande, et execute cette commande. * @param inter l'interpreteur qui demande l'analyse * @return CMD_OK_RETURN_VALUE si la commande s'est exécutée avec succès (0) * @return CMD_EXIT_RETURN_VALUE si c'est la commande exit. Dans ce cas, le programme doit se terminer. (-1) * @return CMD_UNKOWN_RETURN_VALUE si la commande n'est pas reconnue. (-2) * @return tout autre nombre (eg tout nombre positif) si erreur d'execution de la commande */ int execute_cmd(interpreteur inter, memory memory) { DEBUG_MSG("input '%s'", inter->input); char cmdStr[MAX_STR]; memset( cmdStr, '\0', MAX_STR ); /* gestion des commandes vides, commentaires, etc*/ if(strlen(inter->input) == 0 || sscanf(inter->input, "%s", cmdStr) == 0 || strlen(cmdStr) == 0 || cmdStr[0] == '#') { /* ligne commence par # => commentaire*/ return CMD_OK_RETURN_VALUE; } /*on identifie la commande avec un premier appel à get_next_token*/ char * token = get_next_token(inter); if(strcmp(token, "exit") == 0) { return exitcmd(inter); } if(strcmp(token, "load") == 0) { return loadcmd(inter, memory); } else if(strcmp(token, "debug") == 0) { return debugcmd(inter); } else if(strcmp(token, "disp") == 0) { return dispcmd(inter, memory); } else if(strcmp(token, "assert") == 0) { return assertcmd(inter, memory); } else if(strcmp(token, "set") == 0) { return setcmd(inter, memory); } else if(strcmp(token, "resume") == 0) { return resumecmd(inter); } else if(strcmp(token, "disasm") == 0) { return disasmcmd(inter, memory); } else if(strcmp(token, "run") == 0) { return runcmd(inter, memory); } else if(strcmp(token, "step") == 0) { return stepcmd(inter, memory); } else if(strcmp(token, "break") == 0) { return breakcmd(inter, memory); } WARNING_MSG("Unknown Command : '%s'\n", cmdStr); return CMD_UNKOWN_RETURN_VALUE; }
void prn(char s[]) { if( s[0]==8 ) { if(gx) { t[--ti]=0; gx--; setfillstyle(0,0); bar(gx*6, gy*10+2,(gx+1)*6, (gy+2)*10); return; } beep(); ti=0; return; } if(s[0]=='\t') { for(int i=0;i<8;i++) prn(" "); } if(s[0]==13) { gy++,gx=-1; t[ti]=0; strcpy(buf[bufi++],t); buf[bufi-1][ti]=0; if(bufi==47)bufi=0; setcmd(); ti=0; } else outtextxy(gx*6,gy*10,s),t[ti++]=s[0]; gx++; if(gx>=105) { gy++;gx=0; t[ti]=0; strcpy(buf[bufi++],t); if(bufi==47)bufi=0; ti=0; } if(gy>=48) scroll(); }
void mood(void) { static uint8_t command; static uint16_t i=0; static uint16_t r=MAXPWM,g=MAXPWM/2,b=MAXPWM/42; static uint16_t r_dir=R_SPEED, g_dir=G_SPEED, b_dir=B_SPEED; static bool loop=true; command=' '; // default command: none /* Load the next command byte from the USB to USART transmit buffer */ if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) command=RingBuffer_Remove(&USBtoUSART_Buffer); switch (command) { case 'r': if (r >=1000) r-=1000; break; case 'R': if (r <= MAXPWM-1000) r+=1000; break; case 'g': if (g >=1000) g-=1000; break; case 'G': if (g <= MAXPWM-1000) g+=1000; break; case 'b': if (b >=1000) b-=1000; break; case 'B': if (b <= MAXPWM-1000) b+=1000; break; case 'h': loop=true; helloworld(); break; case '#': loop=setcmd(&r,&g,&b); break; case 'm': loop=true; default: if (++i > DELAY) { if(loop) { if (r >= (MAXPWM - R_SPEED)) r_dir = -R_SPEED; if (r <= R_SPEED) r_dir = R_SPEED; if (g >= (MAXPWM - G_SPEED)) g_dir = -G_SPEED; if (g <= G_SPEED) g_dir = G_SPEED; if (b >= (MAXPWM - B_SPEED)) b_dir = -B_SPEED; if (b <= B_SPEED) b_dir = B_SPEED; r += r_dir; g += g_dir; b += b_dir; } setcolor(r,g,b); //if (lowvoltage()) { // red light and stop // setcolor(MAXPWM,0,0); // for(;;); //} i=0; } } }
void docmd(void) { int c; struct ww *w; char out = 0; while (!out && !quit) { if ((c = wwgetc()) < 0) { if (terse) wwsetcursor(0, 0); else { wwputs("Command: ", cmdwin); wwcurtowin(cmdwin); } do wwiomux(); while ((c = wwgetc()) < 0); } if (!terse) wwputc('\n', cmdwin); switch (c) { default: if (c != escapec) break; case 'h': case 'j': case 'k': case 'l': case 'y': case 'p': case ctrl('y'): case ctrl('e'): case ctrl('u'): case ctrl('d'): case ctrl('b'): case ctrl('f'): case ctrl('s'): case ctrl('q'): case ctrl('['): if (selwin == 0) { error("No window."); continue; } } switch (c) { case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if ((w = window[c - '1']) == 0) { error("%c: No such window.", c); break; } setselwin(w); if (checkproc(selwin) >= 0) out = 1; break; case '%': if ((w = getwin()) != 0) setselwin(w); break; case ctrl('^'): if (lastselwin != 0) { setselwin(lastselwin); if (checkproc(selwin) >= 0) out = 1; } else error("No previous window."); break; case 'c': if ((w = getwin()) != 0) closewin(w); break; case 'w': c_window(); break; case 'm': if ((w = getwin()) != 0) c_move(w); break; case 'M': if ((w = getwin()) != 0) movewin(w, w->ww_alt.t, w->ww_alt.l); break; case 's': if ((w = getwin()) != 0) c_size(w); break; case 'S': if ((w = getwin()) != 0) sizewin(w, w->ww_alt.nr, w->ww_alt.nc); break; case 'y': c_yank(); break; case 'p': c_put(); break; case ':': c_colon(); break; case 'h': (void) wwwrite(selwin, "\b", 1); break; case 'j': (void) wwwrite(selwin, "\n", 1); break; case 'k': (void) wwwrite(selwin, "\033A", 2); break; case 'l': (void) wwwrite(selwin, "\033C", 2); break; case ctrl('e'): wwscroll(selwin, 1); break; case ctrl('y'): wwscroll(selwin, -1); break; case ctrl('d'): wwscroll(selwin, selwin->ww_w.nr / 2); break; case ctrl('u'): wwscroll(selwin, - selwin->ww_w.nr / 2); break; case ctrl('f'): wwscroll(selwin, selwin->ww_w.nr); break; case ctrl('b'): wwscroll(selwin, - selwin->ww_w.nr); break; case ctrl('s'): stopwin(selwin); break; case ctrl('q'): startwin(selwin); break; case ctrl('l'): wwredraw(); break; case '?': c_help(); break; case ctrl('['): if (checkproc(selwin) >= 0) out = 1; break; case ctrl('z'): wwsuspend(); break; case 'q': c_quit(); break; /* debugging stuff */ case '&': if (debug) { c_debug(); break; } default: if (c == escapec) { if (checkproc(selwin) >= 0) { (void) write(selwin->ww_pty, &escapec, 1); out = 1; } } else { if (!terse) wwbell(); error("Type ? for help."); } } } if (!quit) setcmd(0); }
/** * * @brief parse la chaine courante de l'interpreteur à la recherche d'une commande, et execute cette commande. * @param inter l'interpreteur qui demande l'analyse * @return CMD_OK_RETURN_VALUE si la commande s'est exécutée avec succès (0) * @return CMD_EXIT_RETURN_VALUE si c'est la commande exit. Dans ce cas, le programme doit se terminer. (-1) * @return CMD_UNKOWN_RETURN_VALUE si la commande n'est pas reconnue. (-2) * @return tout autre nombre (eg tout nombre positif) si erreur d'execution de la commande */ int execute_cmd(interpreteur inter, registre r,mem *memory,bp * bpa) { DEBUG_MSG("input '%s'", inter->input); char cmdStr[MAX_STR]; memset( cmdStr, '\0', MAX_STR ); int b=1; /* gestion des commandes vides, commentaires, etc*/ if(strlen(inter->input) == 0 || sscanf(inter->input, "%s", cmdStr) == 0 || strlen(cmdStr) == 0 || cmdStr[0] == '#') { /* ligne commence par # => commentaire*/ return CMD_OK_RETURN_VALUE; } /*on identifie la commande avec un premier appel à get_next_token*/ char * token = get_next_token(inter); if(strcmp(token, "exit") == 0) { return exitcmd(inter); } else if(strcmp(token, "test") == 0) { return testcmd(inter); } /*else if(strcmp(token, "test2") == 0) { //fonction pour essayer des test rapidement (fichiers tests marchent pas sur mac) int i=0; int n=(*memory)->nseg; for(i=0;i<n;i++){ printf("nom segment %s \n",(*memory)->seg[i].name ); } // int i=0; //vaddr32 c=0; char x[20]; strcpy( x, "$pc" ); printf("is_in_text %d %d %d\n",IsInText(*memory,0x2090),IsInText(*memory,0x3003), IsInText(*memory,0x5000) ); printf("%d\n",convert(x)); // printf("memory %p\n", *memory ); // printf("nombre de segments %u\n", (*memory)->nseg ); // for(i=0;i<(int)(*memory)->nseg;i++){ //printf("adresse segment 0x %"PRIu32" +%d \n",(*memory)->seg->start,t*i); // *memory)->seg->start est un unint32 // c=(int)(*memory)->seg->start._64; //printf("%08x\n",c ); //printf(" %"PRIu32"\n",c ); //printf("adresse segment 0x%.8s \n",itoa(c,16)); // } //int a=350; //setRegisterValue(r,31,a); //printf("%d\n", getRegisterValueByStr(r, "$31")); // printf("%s\n",itoa(a,16) ); // printf("%d\n",is_hexa("0x33AB") ); }*/ else if(strcmp(token, "disp") == 0) { return dispcmd(inter,r,*memory); } else if(strcmp(token, "set") == 0) { return setcmd(inter,r,*memory); } else if(strcmp(token, "load") == 0) { return loadcmd(inter,memory,r); } else if(strcmp(token, "assert") == 0) { return assertcmd(inter,r, *memory); } else if(strcmp(token, "debug") == 0) { debugcmd(inter); return CMD_OK_RETURN_VALUE; } else if(strcmp(token, "resume") == 0) { resumecmd(inter); return CMD_OK_RETURN_VALUE; } else if (strcmp(token,"disasm")==0) { return disasmcmd(inter,*memory); } else if (strcmp(token,"step")==0) { return stepinto(inter,r,*memory,&b,bpa,1); } /* else if (strcmp(token,"step")==0) { return True_step(inter,r,*memory, &b, bpa); }*/ else if (strcmp(token,"run")==0) { run(inter,r,*memory,*bpa); return CMD_OK_RETURN_VALUE; } else if (strcmp(token,"break")==0) { breakcmd(inter,*memory, bpa); // DEBUG_MSG("bpa apres break dans emulMips.c %p",*bpa); return CMD_OK_RETURN_VALUE; } else { WARNING_MSG("Unknown Command : '%s'\n", cmdStr); return CMD_UNKOWN_RETURN_VALUE; } }