Changeset 8676

Show
Ignore:
Timestamp:
01/15/06 08:51:18 (3 years ago)
Author:
audreyt
Message:

* Unescaped UTF8 literal support for YAML dump/load, ported

from Perl5's YAML::Syck.

Location:
src
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • src/Data/Yaml/Syck.hsc

    r8675 r8676  
    1111import Data.IORef 
    1212import Data.Word                (Word8) 
    13 import qualified Data.FastPackedString as P 
     13-- import qualified Data.FastPackedString as P 
    1414import Foreign.Ptr 
    1515import Foreign.StablePtr 
     
    8686        outPtr <- fmap castStablePtrToPtr (newStablePtr out) 
    8787        #{poke SyckEmitter, bonus} emitter outPtr 
     88        #{poke SyckEmitter, style} emitter scalarFold 
    8889        syck_output_handler emitter =<< mkOutputCallback outputCallback 
    8990        syck_emitter_handler emitter =<< mkEmitterCallback emitterCallback 
     
    99100    out     <- deRefStablePtr (castPtrToStablePtr outPtr) 
    100101    str     <- peekCStringLen (buf, fromIntegral len) 
     102    #{poke SyckEmitter, headless} emitter (1 :: CInt) 
    101103    modifyIORef out (++ str) 
    102104 
  • src/Pugs/CodeGen.hs

    r8675 r8676  
    7777    case norm s of 
    7878        ('!':key) -> do 
    79             putStrLn $ "*** The backend '" ++ s ++ "' is deprecated." 
    80             putStrLn $ "    Please use '" ++ key ++ "' instead." 
     79            hPutStrLn stderr $ "*** The backend '" ++ s ++ "' is deprecated." 
     80            hPutStrLn stderr $ "    Please use '" ++ key ++ "' instead." 
    8181            Map.lookup key generators 
    8282        key -> Map.lookup key generators 
  • src/Pugs/Prim/Yaml.hs

    r8675 r8676  
    6666    rv   <- liftIO (emitYaml obj) 
    6767    either (fail . ("YAML Emit Error: "++)) 
    68            (return . VStr) rv 
     68           (return . VStr . decodeUTF8) rv 
    6969 
    7070strNode :: String -> YamlNode 
  • src/syck/emitter.c

    r6793 r8676  
    412412        else 
    413413        { 
    414             char *an = S_ALLOC_N( char, strlen( anchor_name ) + 2 ); 
    415             sprintf( an, "*%s", anchor_name ); 
    416             syck_emitter_write( e, an, strlen( anchor_name ) + 1 ); 
     414            char *an; 
     415            if (anchor_name == NULL) { 
     416                an = S_ALLOC_N( char, x+2 ); 
     417                sprintf(an, "*%d", x); 
     418            } 
     419            else { 
     420                an = S_ALLOC_N( char, strlen( anchor_name ) + 2 ); 
     421                sprintf( an, "*%s", anchor_name ); 
     422            } 
     423 
     424            syck_emitter_write( e, an, strlen( an ) ); 
    417425            free( an ); 
    418426 
     
    759767    for( i = 0; i < len; i++ ) 
    760768    { 
    761         if( (src[i] < 0x20) || (0x7E < src[i]) ) 
     769        if( (e->style == scalar_fold) 
     770                ? ((src[i] < 0x20) && (0 < src[i])) 
     771                : ((src[i] < 0x20) || (0x7E < src[i])) ) 
    762772        { 
    763773            syck_emitter_write( e, "\\", 1 ); 
     
    12181228             */ 
    12191229            st_insert( e->anchors, (st_data_t)oid, (st_data_t)anchor_name ); 
     1230 
     1231            /* XXX - Added by Audrey Tang to handle self-recursive structures - XXX */ 
     1232            return 0; 
    12201233        } 
    12211234    } 
  • src/syck/syck_st.c

    r7592 r8676  
    11/* This is a public domain general purpose hash table package written by Peter Moore @ UCB. */ 
    22 
    3 /* static   char    sccsid[] = "@(#) st.c 5.1 89/12/14 Crucible"; */ 
    4  
    5 #include "ghcconfig.h" 
     3/* static       char    sccsid[] = "@(#) st.c 5.1 89/12/14 Crucible"; */ 
     4 
     5#include "config.h" 
    66#include <stdio.h> 
    77#include <stdlib.h> 
     
    8080*/ 
    8181static long primes[] = { 
    82     8 + 3, 
    83     16 + 3, 
    84     32 + 5, 
    85     64 + 3, 
    86     128 + 3, 
    87     256 + 27, 
    88     512 + 9, 
    89     1024 + 9, 
    90     2048 + 5, 
    91     4096 + 3, 
    92     8192 + 27, 
    93     16384 + 43, 
    94     32768 + 3, 
    95     65536 + 45, 
    96     131072 + 29, 
    97     262144 + 3, 
    98     524288 + 21, 
    99     1048576 + 7, 
    100     2097152 + 17, 
    101     4194304 + 15, 
    102     8388608 + 9, 
    103     16777216 + 43, 
    104     33554432 + 35, 
    105     67108864 + 15, 
    106     134217728 + 29, 
    107     268435456 + 3, 
    108     536870912 + 11, 
    109     1073741824 + 85, 
    110     0 
     82        8 + 3, 
     83        16 + 3, 
     84        32 + 5, 
     85        64 + 3, 
     86        128 + 3, 
     87        256 + 27, 
     88        512 + 9, 
     89        1024 + 9, 
     90        2048 + 5, 
     91        4096 + 3, 
     92        8192 + 27, 
     93        16384 + 43, 
     94        32768 + 3, 
     95        65536 + 45, 
     96        131072 + 29, 
     97        262144 + 3, 
     98        524288 + 21, 
     99        1048576 + 7, 
     100        2097152 + 17, 
     101        4194304 + 15, 
     102        8388608 + 9, 
     103        16777216 + 43, 
     104        33554432 + 35, 
     105        67108864 + 15, 
     106        134217728 + 29, 
     107        268435456 + 3, 
     108        536870912 + 11, 
     109        1073741824 + 85, 
     110        0 
    111111}; 
    112112 
     
    119119#if 0 
    120120    for (i=3; i<31; i++) { 
    121     if ((1<<i) > size) return 1<<i; 
     121        if ((1<<i) > size) return 1<<i; 
    122122    } 
    123123    return -1; 
     
    126126 
    127127    for (i = 0, newsize = MINSIZE; 
    128     i < sizeof(primes)/sizeof(primes[0]); 
    129     i++, newsize <<= 1) 
     128        i < sizeof(primes)/sizeof(primes[0]); 
     129        i++, newsize <<= 1) 
    130130    { 
    131     if (newsize > size) return primes[i]; 
     131        if (newsize > size) return primes[i]; 
    132132    } 
    133133    /* Ran out of polynomials */ 
    134     return -1;          /* should raise exception */ 
     134    return -1;                  /* should raise exception */ 
    135135#endif 
    136136} 
     
    158158#ifdef HASH_LOG 
    159159    if (init_st == 0) { 
    160     init_st = 1; 
    161     atexit(stat_col); 
    162     } 
    163 #endif 
    164  
    165     size = new_size(size);  /* round up to prime number */ 
     160        init_st = 1; 
     161        atexit(stat_col); 
     162    } 
     163#endif 
     164 
     165    size = new_size(size);      /* round up to prime number */ 
    166166 
    167167    tbl = alloc(st_table); 
     
    215215 
    216216    for(i = 0; i < table->num_bins; i++) { 
    217     ptr = table->bins[i]; 
    218     while (ptr != 0) { 
    219         next = ptr->next; 
    220         free(ptr); 
    221         ptr = next; 
    222     } 
     217        ptr = table->bins[i]; 
     218        while (ptr != 0) { 
     219            next = ptr->next; 
     220            free(ptr); 
     221            ptr = next; 
     222        } 
    223223    } 
    224224    free(table->bins); 
     
    239239    ptr = (table)->bins[bin_pos];\ 
    240240    if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {\ 
    241     COLLISION;\ 
    242     while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {\ 
    243         ptr = ptr->next;\ 
    244     }\ 
    245     ptr = ptr->next;\ 
     241        COLLISION;\ 
     242        while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {\ 
     243            ptr = ptr->next;\ 
     244        }\ 
     245        ptr = ptr->next;\ 
    246246    }\ 
    247247} while (0) 
     
    260260 
    261261    if (ptr == 0) { 
    262     return 0; 
     262        return 0; 
    263263    } 
    264264    else { 
    265     if (value != 0)  *value = ptr->record; 
    266     return 1; 
     265        if (value != 0)  *value = ptr->record; 
     266        return 1; 
    267267    } 
    268268} 
     
    272272    st_table_entry *entry;\ 
    273273    if (table->num_entries/(table->num_bins) > ST_DEFAULT_MAX_DENSITY) {\ 
    274     rehash(table);\ 
     274        rehash(table);\ 
    275275        bin_pos = hash_val % table->num_bins;\ 
    276276    }\ 
     
    299299 
    300300    if (ptr == 0) { 
    301     ADD_DIRECT(table, key, value, hash_val, bin_pos); 
    302     return 0; 
     301        ADD_DIRECT(table, key, value, hash_val, bin_pos); 
     302        return 0; 
    303303    } 
    304304    else { 
    305     ptr->record = value; 
    306     return 1; 
     305        ptr->record = value; 
     306        return 1; 
    307307    } 
    308308} 
     
    333333 
    334334    for(i = 0; i < old_num_bins; i++) { 
    335     ptr = table->bins[i]; 
    336     while (ptr != 0) { 
    337         next = ptr->next; 
    338         hash_val = ptr->hash % new_num_bins; 
    339         ptr->next = new_bins[hash_val]; 
    340         new_bins[hash_val] = ptr; 
    341         ptr = next; 
    342     } 
     335        ptr = table->bins[i]; 
     336        while (ptr != 0) { 
     337            next = ptr->next; 
     338            hash_val = ptr->hash % new_num_bins; 
     339            ptr->next = new_bins[hash_val]; 
     340            new_bins[hash_val] = ptr; 
     341            ptr = next; 
     342        } 
    343343    } 
    344344    free(table->bins); 
     
    357357    new_table = alloc(st_table); 
    358358    if (new_table == 0) { 
    359     return 0; 
     359        return 0; 
    360360    } 
    361361 
    362362    *new_table = *old_table; 
    363363    new_table->bins = (st_table_entry**) 
    364     Calloc((unsigned)num_bins, sizeof(st_table_entry*)); 
     364        Calloc((unsigned)num_bins, sizeof(st_table_entry*)); 
    365365 
    366366    if (new_table->bins == 0) { 
    367     free(new_table); 
    368     return 0; 
     367        free(new_table); 
     368        return 0; 
    369369    } 
    370370 
    371371    for(i = 0; i < num_bins; i++) { 
    372     new_table->bins[i] = 0; 
    373     ptr = old_table->bins[i]; 
    374     while (ptr != 0) { 
    375         entry = alloc(st_table_entry); 
    376         if (entry == 0) { 
    377         free(new_table->bins); 
    378         free(new_table); 
    379         return 0; 
    380         } 
    381         *entry = *ptr; 
    382         entry->next = new_table->bins[i]; 
    383         new_table->bins[i] = entry; 
    384         ptr = ptr->next; 
    385     } 
     372        new_table->bins[i] = 0; 
     373        ptr = old_table->bins[i]; 
     374        while (ptr != 0) { 
     375            entry = alloc(st_table_entry); 
     376            if (entry == 0) { 
     377                free(new_table->bins); 
     378                free(new_table); 
     379                return 0; 
     380            } 
     381            *entry = *ptr; 
     382            entry->next = new_table->bins[i]; 
     383            new_table->bins[i] = entry; 
     384            ptr = ptr->next; 
     385        } 
    386386    } 
    387387    return new_table; 
     
    402402 
    403403    if (ptr == 0) { 
    404     if (value != 0) *value = 0; 
    405     return 0; 
     404        if (value != 0) *value = 0; 
     405        return 0; 
    406406    } 
    407407 
    408408    if (EQUAL(table, *key, ptr->key)) { 
    409     table->bins[hash_val] = ptr->next; 
    410     table->num_entries--; 
    411     if (value != 0) *value = ptr->record; 
    412     *key = ptr->key; 
    413     free(ptr); 
    414     return 1; 
     409        table->bins[hash_val] = ptr->next; 
     410        table->num_entries--; 
     411        if (value != 0) *value = ptr->record; 
     412        *key = ptr->key; 
     413        free(ptr); 
     414        return 1; 
    415415    } 
    416416 
    417417    for(; ptr->next != 0; ptr = ptr->next) { 
    418     if (EQUAL(table, ptr->next->key, *key)) { 
    419         tmp = ptr->next; 
    420         ptr->next = ptr->next->next; 
    421         table->num_entries--; 
    422         if (value != 0) *value = tmp->record; 
    423         *key = tmp->key; 
    424         free(tmp); 
    425         return 1; 
    426     } 
     418        if (EQUAL(table, ptr->next->key, *key)) { 
     419            tmp = ptr->next; 
     420            ptr->next = ptr->next->next; 
     421            table->num_entries--; 
     422            if (value != 0) *value = tmp->record; 
     423            *key = tmp->key; 
     424            free(tmp); 
     425            return 1; 
     426        } 
    427427    } 
    428428 
     
    444444 
    445445    if (ptr == 0) { 
    446     if (value != 0) *value = 0; 
    447     return 0; 
     446        if (value != 0) *value = 0; 
     447        return 0; 
    448448    } 
    449449 
    450450    for(; ptr != 0; ptr = ptr->next) { 
    451     if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) { 
    452         table->num_entries--; 
    453         *key = ptr->key; 
    454         if (value != 0) *value = ptr->record; 
    455         ptr->key = ptr->record = never; 
    456         return 1; 
    457     } 
     451        if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) { 
     452            table->num_entries--; 
     453            *key = ptr->key; 
     454            if (value != 0) *value = ptr->record; 
     455            ptr->key = ptr->record = never; 
     456            return 1; 
     457        } 
    458458    } 
    459459 
     
    491491 
    492492    for(i = 0; i < table->num_bins; i++) { 
    493     last = 0; 
    494     for(ptr = table->bins[i]; ptr != 0;) { 
    495         retval = (*func)(ptr->key, ptr->record, arg); 
    496         switch (retval) { 
    497         case ST_CONTINUE: 
    498         last = ptr; 
    499         ptr = ptr->next; 
    500         break; 
    501         case ST_STOP: 
    502         return; 
    503         case ST_DELETE: 
    504         tmp = ptr; 
    505         if (last == 0) { 
    506             table->bins[i] = ptr->next; 
    507         } 
    508         else { 
    509             last->next = ptr->next; 
    510         } 
    511         ptr = ptr->next; 
    512         free(tmp); 
    513         table->num_entries--; 
    514         } 
    515     } 
     493        last = 0; 
     494        for(ptr = table->bins[i]; ptr != 0;) { 
     495            retval = (*func)(ptr->key, ptr->record, arg); 
     496            switch (retval) { 
     497            case ST_CONTINUE: 
     498                last = ptr; 
     499                ptr = ptr->next; 
     500                break; 
     501            case ST_STOP: 
     502                return; 
     503            case ST_DELETE: 
     504                tmp = ptr; 
     505                if (last == 0) { 
     506                    table->bins[i] = ptr->next; 
     507                } 
     508                else { 
     509                    last->next = ptr->next; 
     510                } 
     511                ptr = ptr->next; 
     512                free(tmp); 
     513                table->num_entries--; 
     514            } 
     515        } 
    516516    } 
    517517} 
     
    527527 
    528528    while ((c = *string++) != '\0') { 
    529     h = ( h << 4 ) + c; 
    530     if ( g = h & 0xF0000000 ) 
    531         h ^= g >> 24; 
    532     h &= ~g; 
     529        h = ( h << 4 ) + c; 
     530        if ( g = h & 0xF0000000 ) 
     531            h ^= g >> 24; 
     532        h &= ~g; 
    533533    } 
    534534    return h; 
     
    537537 
    538538    while ((c = *string++) != '\0') { 
    539     val = val*33 + c; 
     539        val = val*33 + c; 
    540540    } 
    541541 
     
    556556 
    557557    while ((c = *string++) != '\0') { 
    558     val = val*997 + c; 
     558        val = val*997 + c; 
    559559    } 
    560560