Changeset 461 for branches/juciphox/lib/ubasic/ubasic.c
- Timestamp:
- 08/01/08 19:52:37 (5 years ago)
- File:
-
- 1 edited
-
branches/juciphox/lib/ubasic/ubasic.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/juciphox/lib/ubasic/ubasic.c
r453 r461 75 75 static int if_stack_ptr; 76 76 77 struct select_state { 78 int select_value; 79 short case_run; 80 }; 81 #define MAX_SELECT_STACK_DEPTH 4 82 static struct select_state select_stack[MAX_SELECT_STACK_DEPTH]; 83 static int select_stack_ptr; 84 85 86 77 87 #define MAX_WHILE_STACK_DEPTH 4 78 88 static short while_stack[MAX_WHILE_STACK_DEPTH]; … … 244 254 case TOKENIZER_RANDOM: 245 255 accept(TOKENIZER_RANDOM); 256 int min = expr(); 257 int max = expr(); 246 258 srand((int)shooting_get_bv96()+(unsigned short)stat_get_vbatt()+get_tick_count()); 247 259 ubasic_camera_sleep(rand()%10); 248 r = rand();249 break;250 case TOKENIZER_GET_MOVIE STATE:251 accept(TOKENIZER_GET_MOVIE STATE);260 r = min + rand()%(max-min+1); 261 break; 262 case TOKENIZER_GET_MOVIE_STATUS: 263 accept(TOKENIZER_GET_MOVIE_STATUS); 252 264 r = movie_status; 253 265 break; … … 260 272 r = shooting_get_prop(PROPCASE_FOCUS_MODE); 261 273 break; 262 case TOKENIZER_GET_DISPLAY_MODE:274 case TOKENIZER_GET_DISPLAY_MODE: 263 275 accept(TOKENIZER_GET_DISPLAY_MODE); 264 276 r = shooting_get_prop(PROPCASE_DISPLAY_MODE); … … 409 421 else r = -1; 410 422 break; 423 case TOKENIZER_GET_TEMPERATURE: 424 accept(TOKENIZER_GET_TEMPERATURE); 425 int temp = expr(); 426 switch (temp) 427 { 428 case 0: 429 r = get_optical_temp(); 430 break; 431 case 1: 432 r = get_ccd_temp(); 433 break; 434 case 2: 435 r = get_battery_temp(); 436 break; 437 } 438 break; 411 439 case TOKENIZER_GET_RAW: 412 440 accept(TOKENIZER_GET_RAW); … … 765 793 } 766 794 /*---------------------------------------------------------------------------*/ 795 796 /*---------------------------------------------------------------------------*/ 797 /* SELECT-STATEMENT */ 798 799 static void 800 dec_select_stack(void) 801 { 802 if(select_stack_ptr > 0) { 803 select_stack_ptr--; 804 } else { 805 DEBUG_PRINTF("select_statement: SELECT-Stack fail\n"); 806 ended = 1; 807 ubasic_error = UBASIC_E_UNKNOWN_ERROR; //besser neuer Fehler UBASIC_E_SELECT_STACK_EXHAUSTED, 808 } 809 } 810 /*---------------------------------------------------------------------------*/ 811 static void 812 end_select(void) 813 { 814 if(select_stack_ptr > 0) { 815 accept(TOKENIZER_END_SELECT); 816 accept(TOKENIZER_CR); 817 dec_select_stack(); 818 } else { 819 DEBUG_PRINTF("ubasic.c: end_select(): end_select without select-statement\n"); 820 ended = 1; 821 ubasic_error = UBASIC_E_PARSE; 822 } 823 } 824 /*---------------------------------------------------------------------------*/ 825 static void 826 case_statement(void) 827 { 828 int select_value, case_value_1, case_value_2, case_value_eq; 829 short case_run, case_goto = 0, case_gosub = 0; 830 831 accept(TOKENIZER_CASE); 832 if(select_stack_ptr > 0) { 833 select_value = select_stack[select_stack_ptr - 1].select_value; 834 case_run = select_stack[select_stack_ptr - 1].case_run; 835 836 if (!case_run) { 837 case_value_1 = expr(); 838 case_value_eq = (select_value == case_value_1); 839 if (case_value_eq) { DEBUG_PRINTF("case_statement: case_value_eq %d, case_value %d\n", case_value_eq, case_value_1); } 840 841 if(tokenizer_token() == TOKENIZER_TO) { 842 accept(TOKENIZER_TO); 843 case_value_2 = expr(); 844 if (case_value_1 < case_value_2) { 845 case_value_eq = ((select_value >= case_value_1) && (select_value <= case_value_2)); 846 DEBUG_PRINTF("case_statement: case_value %d to %d\n", case_value_1, case_value_2); 847 } else { 848 case_value_eq = ((select_value >= case_value_2) && (select_value <= case_value_1)); 849 DEBUG_PRINTF("case_statement: case_value %d to %d\n", case_value_2, case_value_1); 850 } 851 } else if (tokenizer_token() == TOKENIZER_COMMA) { 852 do { 853 accept(TOKENIZER_COMMA); 854 if (case_value_eq) { 855 case_value_2 = expr(); 856 } else { 857 case_value_1 = expr(); 858 case_value_eq = (select_value == case_value_1); 859 } 860 } while (tokenizer_token() == TOKENIZER_COMMA); 861 DEBUG_PRINTF("case_statement: case_value_eq %d, case_value_comma %d\n", case_value_eq, case_value_1); 862 } 863 864 accept(TOKENIZER_SEMICOLON); 865 if (case_value_eq) { 866 case_goto = (tokenizer_token() == TOKENIZER_GOTO); 867 case_gosub = (tokenizer_token() == TOKENIZER_GOSUB); 868 statement(); 869 DEBUG_PRINTF("case_statement: case execute\n"); 870 case_run = 1; 871 select_stack[select_stack_ptr - 1].case_run = case_run; 872 } else { 873 DEBUG_PRINTF("case_statement: case jump; case_run: %d\n", case_run); 874 accept_cr(); 875 } 876 } else {accept_cr();} 877 if (case_goto) { dec_select_stack(); } else { 878 if (!case_gosub) { 879 if ((tokenizer_token() != TOKENIZER_CASE) && (tokenizer_token() != TOKENIZER_CASE_ELSE) && 880 (tokenizer_token() != TOKENIZER_END_SELECT)) { 881 DEBUG_PRINTF("ubasic.c: select_statement(): don't found case, case_else or end_select\n"); 882 ended = 1; 883 ubasic_error = UBASIC_E_PARSE; 884 } else { 885 if (tokenizer_token() == TOKENIZER_END_SELECT) { end_select(); } 886 } 887 } 888 } 889 } else { 890 DEBUG_PRINTF("case_statement: SELECT-Stack fail\n"); 891 ended = 1; 892 ubasic_error = UBASIC_E_UNKNOWN_ERROR; //besser neuer Fehler UBASIC_E_SELECT_STACK_EXHAUSTED, 893 } 894 } 895 /*---------------------------------------------------------------------------*/ 896 static void 897 case_else_statement(void) 898 { 899 short case_goto = 0, case_gosub = 0; 900 901 accept(TOKENIZER_CASE_ELSE); 902 if(select_stack_ptr > 0) { 903 if (!select_stack[select_stack_ptr - 1].case_run) { 904 case_goto = (tokenizer_token() == TOKENIZER_GOTO); 905 case_gosub = (tokenizer_token() == TOKENIZER_GOSUB); 906 statement(); 907 DEBUG_PRINTF("case_else_statement: case_else execute\n"); 908 } else { 909 DEBUG_PRINTF("case_else_statement: case_else jump; case_run: %d\n", select_stack[select_stack_ptr - 1].case_run); 910 accept_cr(); 911 } 912 if (case_goto) { dec_select_stack(); } else { 913 if (!case_gosub) { 914 if (tokenizer_token() != TOKENIZER_END_SELECT) { 915 DEBUG_PRINTF("ubasic.c: select_statement(): don't found end_select\n"); 916 ended = 1; 917 ubasic_error = UBASIC_E_PARSE; 918 } else { end_select(); } 919 } 920 } 921 } else { 922 DEBUG_PRINTF("case_else_statement: SELECT-Stack fault\n"); 923 ended = 1; 924 ubasic_error = UBASIC_E_UNKNOWN_ERROR; //besser neuer Fehler UBASIC_E_SELECT_STACK_EXHAUSTED, 925 } 926 } 927 /*---------------------------------------------------------------------------*/ 928 static void 929 select_statement(void) 930 { 931 932 int select_value; 933 934 accept(TOKENIZER_SELECT); 935 select_value = expr(); 936 accept(TOKENIZER_CR); 937 938 if(select_stack_ptr < MAX_SELECT_STACK_DEPTH) { 939 select_stack[select_stack_ptr].select_value = select_value; 940 select_stack[select_stack_ptr].case_run = 0; 941 DEBUG_PRINTF("select_statement: new select, value %d\n",select_stack[select_stack_ptr].select_value); 942 select_stack_ptr++; 943 if (tokenizer_token() != TOKENIZER_CASE) { 944 DEBUG_PRINTF("ubasic.c: select_statement(): don't found case-statement\n"); 945 ended = 1; 946 ubasic_error = UBASIC_E_PARSE; 947 } 948 //NEU f?r diekten "case"-befehl 949 else { case_statement(); } 950 //--------------------------- 951 } else { 952 DEBUG_PRINTF("select_statement: SELECT-stack depth exceeded\n"); 953 ended = 1; 954 ubasic_error = UBASIC_E_UNKNOWN_ERROR; //besser neuer Fehler UBASIC_E_SELECT_STACK_EXHAUSTED, 955 } 956 } 957 /* SELECT-STATEMENT END */ 958 767 959 /*---------------------------------------------------------------------------*/ 768 960 static void … … 1283 1475 } 1284 1476 1477 static void play_sound_statement() 1478 { 1479 int to; 1480 accept(TOKENIZER_PLAY_SOUND); 1481 to = expr(); 1482 play_sound(to); 1483 accept_cr(); 1484 } 1285 1485 static void set_shutter_speed_statement() 1286 1486 { … … 1887 2087 set_tv96_statement(); 1888 2088 break; 2089 case TOKENIZER_PLAY_SOUND: 2090 play_sound_statement(); 2091 break; 1889 2092 case TOKENIZER_SET_SHUTTER_SPEED: 1890 2093 set_shutter_speed_statement(); … … 1993 2196 endif_statement(); 1994 2197 break; 2198 case TOKENIZER_SELECT: 2199 select_statement(); 2200 break; 2201 case TOKENIZER_CASE: 2202 case_statement(); 2203 break; 2204 case TOKENIZER_CASE_ELSE: 2205 case_else_statement(); 2206 break; 1995 2207 case TOKENIZER_GOTO: 1996 2208 goto_statement();
Note: See TracChangeset
for help on using the changeset viewer.