AST_stmt* readASTStmt(BufferedReader *reader) { uint8_t type = reader->readByte(); if (VERBOSITY("parsing") >= 2) printf("type = %d\n", type); if (type == 0) return NULL; uint8_t checkbyte = reader->readByte(); assert(checkbyte == 0xae); switch (type) { case AST_TYPE::Assign: return read_assign(reader); case AST_TYPE::AugAssign: return read_augassign(reader); case AST_TYPE::Break: return read_break(reader); case AST_TYPE::ClassDef: return read_classdef(reader); case AST_TYPE::Continue: return read_continue(reader); case AST_TYPE::Expr: return read_expr(reader); case AST_TYPE::For: return read_for(reader); case AST_TYPE::FunctionDef: return read_functiondef(reader); case AST_TYPE::Global: return read_global(reader); case AST_TYPE::If: return read_if(reader); case AST_TYPE::Import: return read_import(reader); case AST_TYPE::ImportFrom: return read_importfrom(reader); case AST_TYPE::Pass: return read_pass(reader); case AST_TYPE::Print: return read_print(reader); case AST_TYPE::Return: return read_return(reader); case AST_TYPE::While: return read_while(reader); case AST_TYPE::With: return read_with(reader); default: fprintf(stderr, "Unknown stmt node type (parser.cpp:" STRINGIFY(__LINE__) "): %d\n", type); exit(1); break; } }
boolean Global::ChangeS1S5(int value) { boolean ret = false; int nbtap, tot, ct; if ( Menu->ChangeS1S5(value) ) { if ( Menu->FirstPage ) { switch (Menu->S1S5) { case 1 : // Tap Tempo for (ct=TAPTEMPO_MAX-1;ct>0;ct--) tapTempo[ct]=tapTempo[ct-1]; tapTempo[ 0 ] = millis(); nbtap=0; tot=0; for ( int ct=0;ct<TAPTEMPO_MAX-1; ct++ ) { if ( tapTempo[ ct ] - tapTempo[ ct + 1] < (60000/TEMPO_MIN) ) { tot += ( tapTempo[ct] - tapTempo[ct+1] ); nbtap++; } } if ( nbtap > 0 ) { ParamGlo.Tempo = (uint16_t)60000 / ( tot / nbtap ); if ( ParamGlo.Tempo < TEMPO_MIN ) ParamGlo.Tempo=TEMPO_MIN; if ( ParamGlo.Tempo > TEMPO_MAX ) ParamGlo.Tempo=TEMPO_MAX; Menu->SetM1(ParamGlo.Tempo); SClock.ChangeTempo(); } break; case 3 : if (!is_played) { ExStart(false); lcdM.setCursor(8,3); lcdM.print("Stop"); } else { ExStop(); lcdM.setCursor(8,3); lcdM.print("Play"); } break; case 2 : if (!is_played) { ExStart(true); lcdM.setCursor(8,3); lcdM.print("Stop"); } else { ExStop(); lcdM.setCursor(8,3); lcdM.print("Play"); } break; case 4 : switch (Recorder.mode_Record) { case RECORD_OFF: Recorder.mode_Record=RECORD_PLAY; lcdM.setCursor(13,3); lcdM.print("Ply"); Recorder.cur_Play_Record=0; clock_count=0; break; case RECORD_PLAY: if ( !is_played ) { Recorder.mode_Record=RECORD_ON; lcdM.setCursor(13,3); lcdM.print("Rec"); } else { Recorder.mode_Record=RECORD_OFF; lcdM.setCursor(13,3); lcdM.print("Off"); } break; case RECORD_ON: Recorder.mode_Record=RECORD_OFF; lcdM.setCursor(13,3); lcdM.print("Off"); break; } break; } } else { switch (Menu->S1S5) { case 3: switch( Menu->curCmd ) { case 0: /* Load */ SPOut.AutoOff( ParamGlo.UpperDest ); SPOut.AutoOff( ParamGlo.LowerDest ); if ( MySD.OpenFileForRead(MODE_PARAM, Menu->GetFName(FileName) ) ) { Restore(); MySD.CloseFile(); } PatLed.Show(0); UpdateRoute(0); DessinPage(); break; case 1: /* Save */ if ( MySD.OpenFileForWrite(MODE_PARAM, Menu->MenuFName(FileName) ) ) { Backup(); MySD.CloseFile(); } PatLed.Show(0); break; case 2: /* Load All*/ SPOut.AutoOff( ParamGlo.UpperDest ); SPOut.AutoOff( ParamGlo.LowerDest ); read_global(Menu->GetFName(FileName)); PatLed.Show(0); DessinPage(); break; case 3: /* Save All*/ write_global(Menu->MenuFName(FileName) ); PatLed.Show(0); break; case 4: /* Init */ SPOut.AutoOff( ParamGlo.UpperDest ); SPOut.AutoOff( ParamGlo.LowerDest ); if ( Menu->V1 == 0 ) Init(); else init_global(); PatLed.Show(0); DessinPage(); break; case 5: S4822.Send(CV_1, 400*Menu->V1 ); S4822.Send(CV_2, 400*Menu->V1); S4822.Send(CV_3, 400*Menu->V1 ); S4822.Send(CV_4, 400*Menu->V1 ); S4822.Send(CV_5, 400*Menu->V1 ); S4822.Send(CV_6, 400*Menu->V1 ); S4822.Send(CV_7, 400*Menu->V1 ); S4822.Send(CV_8, 400*Menu->V1 ); // analogWrite(DAC0, 400*Menu->V1 ); // analogWrite(DAC1, 400*Menu->V1 ); PatLed.Show(0); break; case 6: digitalWrite(TRIG_1, Menu->V1 ); digitalWrite(TRIG_2, Menu->V1 ); digitalWrite(TRIG_3, Menu->V1 ); digitalWrite(TRIG_4, Menu->V1 ); digitalWrite(TRIG_5, Menu->V1 ); digitalWrite(TRIG_6, Menu->V1 ); digitalWrite(TRIG_7, Menu->V1 ); digitalWrite(TRIG_8, Menu->V1 ); PatLed.Show(0); break; } break; } } } return ret; }
int main (void) { { char buff[100]; strcpy(buff, "abc"); cj_jail(strcpy, 2, buff, "def"); presult(1, strcmp(buff, "abc") == 0); } { char buff[100]; strcpy(buff, "abc"); cj_jail(strcpy, 2, buff, "def"); cj_recv(buff, sizeof(buff)); presult(2, strcmp(buff, "def") == 0); } cj_jail(set_global, 1, 12345); presult(3, cj_jail(get_global, 0) == 12345); presult(4, *(int *)cj_jail(get_globalref, 0) == 12345); { char buff[100]; strcpy(buff, "Hello World!"); cj_jail(strtoupper, 1, buff); presult(5, strcmp(buff, "Hello World!") == 0); cj_recv(buff, sizeof(buff)); presult(6, strcmp(buff, "HELLO WORLD!") == 0); } { char *buff = malloc(100); write_global("foo7"); presult(7, strcmp(read_globalref(), "foo7") == 0); read_global(buff); presult(8, strcmp(buff, "foo7") == 0); strcpy(buff, "foo8"); cj_jail(read_global, 1, buff); presult(9, strcmp(buff, "foo8") == 0); cj_recv(buff, 100); presult(10, strcmp(buff, "foo7") == 0); } { const int num = 1000; void *arr[num]; int i; srand(1); for (i = 0; i < num; i ++) { arr[i] = malloc(rand() % 500 + 1); if (arr[i] == NULL) break; if (rand() % 2) { int j = rand() % (i + 1); free(arr[j]); arr[j] = malloc(rand() % 500 + 1); if (arr[j] == NULL) break; } } presult(11, i == num); for (i = 0; i < num; i ++) free(arr[i]); for (i = 0; i < num; i ++) { arr[i] = (void *)cj_jail(malloc, 1, rand() % 500 + 1); if (arr[i] == NULL) break; if (rand() % 2) { int j = rand() % (i + 1); if (rand() % 2) free(arr[j]); else cj_jail(free, 1, arr[j]); arr[j] = (void *)cj_jail(malloc, 1, rand() % 500 + 1); if (arr[j] == NULL) break; } } presult(12, i == num); for (i = 0; i < num; i ++) free(arr[i]); } presult(13, call_callback(callback1, 1) == 4); presult(14, cj_jail(call_callback, 2, cj_reg_callback(callback1, NULL, 1), 1) == 4); presult(15, cj_jail(call_callback, 2, cj_reg_callback(callback1, callback1_wrapper, 1), 1) == 14); presult(16, cj_jail(call_callback, 2, cj_reg_callback(callback2, NULL, 1), 1) == 8); return 0; }