Changeset 186

Show
Ignore:
Timestamp:
06/17/06 21:06:45 (3 years ago)
Author:
krobillard
Message:

Thune - Can now tokenize int! as hexadecimal.

Location:
trunk/thune
Files:
8 modified

Legend:

Unmodified
Added
Removed
  • trunk/thune/charset.c

    r1 r186  
    5151 
    5252 
     53/* Hex: 0-9 a-z A-Z */ 
     54uint8_t charset_hex[32] = { 
     55    0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x03, 
     56    0x7E,0x00,0x00,0x00,0x7E,0x00,0x00,0x00, 
     57    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
     58    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 
     59}; 
     60 
     61 
    5362/*EOF*/ 
  • trunk/thune/charset.h

    r1 r186  
    88extern uint8_t charset_word[32]; 
    99extern uint8_t charset_binary[32]; 
     10extern uint8_t charset_hex[32]; 
    1011 
    1112 
  • trunk/thune/eval.c

    r185 r186  
    4949#define PUSHC_CELL(val) \ 
    5050    *((UCell*) UR_TOC) = val; \ 
    51     UR_C_GROW 
    52  
    53 #define PUSHC_NONE \ 
    54     ur_initType(UR_TOC, UT_NONE); \ 
    5551    UR_C_GROW 
    5652 
     
    855851                        while( argc < totc ) 
    856852                        { 
    857                             PUSHC_NONE; 
     853                            ur_initType(UR_TOC, UT_NONE); 
     854                            UR_C_GROW; 
    858855                            ++argc; 
    859856                        } 
  • trunk/thune/make.c

    r184 r186  
    2828 
    2929extern int ur_stringToInt( const char*, const char*, const char** ); 
     30extern int ur_hexToInt( const char*, const char*, const char** ); 
    3031extern double ur_stringToDec( const char*, const char*, const char** ); 
    3132 
     
    916917        { 
    917918            int n = 0; 
     919            int hex = 0; 
    918920            if( ur_is(tos, UT_DECIMAL) ) 
    919921            { 
     
    923925            { 
    924926                if( spA ) 
    925                     n = ur_stringToInt( spA, spB, 0 ); 
     927                { 
     928                    if( *spA == '$' ) 
     929                    { 
     930                        n = ur_hexToInt( ++spA, spB, 0 ); 
     931                        hex = 1; 
     932                    } 
     933                    else 
     934                    { 
     935                        n = ur_stringToInt( spA, spB, 0 ); 
     936                    } 
     937                } 
    926938            } 
    927939            else 
    928940                goto error; 
     941 
    929942            ur_initType( res, UT_INT ); 
    930943            ur_int(res) = n; 
     944            if( hex ) 
     945                res->id.flags |= UR_FLAG_INT_HEX; 
    931946        } 
    932947            break; 
  • trunk/thune/print.c

    r185 r186  
    167167    EXPAND( out, 16 ); 
    168168    cp = out->ptr.c + out->used; 
    169 /* 
    170     strPrint( cp, "$%x", n ); 
    171     while( *cp != '\0' ) 
    172         ++cp; 
    173 */ 
    174169    *cp++ = '$'; 
    175170    cp = ur_intToStr( n, cp, 16 ); 
    176  
    177171    out->used = cp - out->ptr.c; 
    178172} 
     
    706700                            EXPAND( out, 32 ); 
    707701                            cp = out->ptr.c + out->used; 
    708                             strPrint( cp, "%dx%d", val->pair[0], val->pair[1]); 
    709                             while( *cp != '\0' ) 
     702                            strPrint( cp, "%dx%d", val->pair[0], val->pair[1]); while( *cp != '\0' ) 
    710703                                ++cp; 
    711704                            out->used = cp - out->ptr.c; 
     
    804797    */ 
    805798 
    806     switch( val->id.type ) 
     799    switch( ur_type(val) ) 
    807800    { 
    808801        case UT_NONE:       append(out, "none", 4); break; 
     
    11991192 
    12001193        default: 
    1201             { 
    1202             char* cp; 
    1203             append( out, "<bad dt #", 9 ); 
    1204             EXPAND( out, 12 ); 
    1205             cp = out->ptr.c + out->used; 
    1206             strPrint( cp, "%x", val->num.i); 
    1207             while( *cp != '\0' ) 
    1208                 ++cp; 
    1209             out->used = cp - out->ptr.c; 
     1194            append( out, "<bad dt ", 8 ); 
     1195            appendInteger( out, ur_type(val) ); 
    12101196            append1('>', out); 
    1211             } 
    12121197            break; 
    12131198    } 
  • trunk/thune/tests/working/parse.good

    r141 r186  
    11-- T1 Types -- 
    22[:a-b 1 c2 1.23 2 3 
     3    $FF $20 
    34    'go 'd' 0 
    45    arr/1 pos/x 
     
    1011int! 2 
    1112int! 3 
     13int! $FF 
     14int! $20 
    1215lit-word! 'go 
    1316char! 'd' 
  • trunk/thune/tests/working/parse.t

    r162 r186  
    3838    ['0' - '9'] charset :digit 
    3939    ['a' - 'z' 'A' - 'Z'] charset :alpha 
    40     ['a' - 'z' 'A' - 'Z' '0' - '9' "+-*_.,!?|&"] charset :wordc 
    41     ['a' - 'z' 'A' - 'Z' "+-*/_.,!?|&"] charset :word-start 
     40    ['a' - 'z' 'A' - 'Z' '0' - '9' "+-*_.,!?|&<>="] charset :wordc 
     41    ['a' - 'z' 'A' - 'Z' "+-*/_.,!?|&<>="] charset :word-start 
    4242    ['0' - '9'] charset :digit 
    4343    ['0' - '9' 'a' - 'f' 'A' - 'F'] charset :hex 
     
    6161        | opt sign some digit [ 
    6262              '.' any digit tok:  (decimal! tok app) 
     63            ;| 1 5 [',' opt sign some digit] tok: (tuple! tok app) 
    6364            | tok:  (int! tok app) 
    6465          ] 
     66        | '$' some hex tok: (int! tok app) 
     67        ;| '<' any ' ' 1 3 decimal any ' ' '>' tok: (vec3! tok app) 
    6568        | word [ 
    6669              ':' tok:  (get-word! tok slice.prev app) 
     
    104107{-- T1 Types --} print 
    105108{:a-b 1 c2 1.23 2 3 
     109 $ff $0020 
    106110 'go 'd' 0.0 
    107111 arr/1  pos/x 
  • trunk/thune/tokenize.c

    r185 r186  
    5959 
    6060 
    61 #ifdef OR_CONFIG_HEX_TOKEN 
    62 int hexStringToInt( const char* start, const char* end ) 
    63 { 
     61int ur_hexToInt( const char* start, const char* end, const char** pos ) 
     62{ 
     63    int cn; 
    6464    int n = 0; 
    6565    const char* cp = start; 
     
    6969    while( cp != end ) 
    7070    { 
     71        cn = *cp; 
     72        if( cn >= 'a' ) 
     73            cn = cn - 'a' + 10; 
     74        else if( cn >= 'A' ) 
     75            cn = cn - 'A' + 10; 
     76        else 
     77            cn -= '0'; 
     78        if( cn < 0 || cn > 15 ) 
     79            goto finish; 
     80 
    7181        n *= 16; 
    72         if( *cp >= 'a' ) 
    73             n += *cp - 'a' + 10; 
    74         else if( *cp >= 'A' ) 
    75             n += *cp - 'A' + 10; 
    76         else 
    77             n += *cp - '0'; 
    78         ++cp; 
    79     } 
     82        n += cn; 
     83        ++cp; 
     84    } 
     85 
     86finish: 
     87 
    8088    if( *start == '-' ) 
    8189        n = -n; 
    82  
     90    if( pos ) 
     91        *pos = cp; 
    8392    return n; 
    8493} 
    85 #endif 
    8694 
    8795 
     
    212220#define BLOCK           ur_blockPtr( STACK[ stack.used - 1 ] ) 
    213221#define IS_DIGIT(v)     (('0' <= v) && (v <= '9')) 
     222#define IS_HEX(v)       ur_bitIsSet(charset_hex,v) 
    214223 
    215224#define syntaxError(msg) \ 
     
    296305                    ++it; 
    297306                    goto sign; 
     307 
     308                case '$': 
     309                    ++it; 
     310                    goto dollar; 
    298311 
    299312                case '[': 
     
    421434    if( IS_DIGIT(ch) ) 
    422435        goto integer; 
     436    goto word; 
     437 
     438dollar: 
     439 
     440    if( it == end ) 
     441    { 
     442        mode = UT_WORD; 
     443        goto word_append; 
     444    } 
     445    ch = *it; 
     446    if( IS_HEX(ch) ) 
     447        goto hex_num; 
     448    //goto word; 
    423449 
    424450word: 
     
    507533    cell = ur_appendCell( BLOCK, mode ); 
    508534    if( mode == UT_DECIMAL ) 
     535    { 
    509536        ur_decimal(cell) = ur_stringToDec( token, it, 0 ); 
     537    } 
    510538    else 
     539    { 
    511540        ur_int(cell) = ur_stringToInt( token, it, 0 ); 
     541    } 
     542    goto set_eol; 
     543 
     544hex_num: 
     545 
     546    SCAN_LOOP 
     547        if( ! IS_HEX(ch) ) 
     548            break; 
     549    SCAN_END 
     550 
     551    cell = ur_appendCell( BLOCK, UT_INT ); 
     552    cell->id.flags |= UR_FLAG_INT_HEX; 
     553    ur_int(cell) = ur_hexToInt( ++token, it, 0 ); 
    512554    goto set_eol; 
    513555