Changeset 3527


Ignore:
Timestamp:
May 27, 2009 7:04:17 AM (5 years ago)
Author:
sam
Message:

Autodetect message size in img2twit.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libpipi/trunk/examples/img2twit.cpp

    r3526 r3527  
    245245{ 
    246246public: 
    247     bitstack() { alloc(); init(0); } 
     247    bitstack(int max) { alloc(max); init(0); } 
    248248 
    249249    ~bitstack() { delete[] digits; delete[] str; } 
     
    286286 
    287287private: 
    288     bitstack(uint32_t i) { alloc(); init(i); } 
     288    bitstack(int max, uint32_t x) { alloc(max); init(x); } 
    289289 
    290290    bitstack(bitstack &b) 
    291291    { 
    292         alloc(); 
     292        alloc(b.max_size); 
    293293        msb = b.msb; 
    294         memcpy(digits, b.digits, (MAX_MSG_LEN + 1) * sizeof(uint32_t)); 
     294        memcpy(digits, b.digits, (max_size + 1) * sizeof(uint32_t)); 
    295295    } 
    296296 
    297297    bitstack(bitstack const &b) 
    298298    { 
    299         alloc(); 
     299        alloc(b.max_size); 
    300300        msb = b.msb; 
    301         memcpy(digits, b.digits, (MAX_MSG_LEN + 1) * sizeof(uint32_t)); 
    302     } 
    303  
    304     void alloc() 
    305     { 
    306         digits = new uint32_t[MAX_MSG_LEN + 1]; 
    307         str = new char[(MAX_MSG_LEN + 1) * 8 + 1]; 
     301        memcpy(digits, b.digits, (max_size + 1) * sizeof(uint32_t)); 
     302    } 
     303 
     304    void alloc(int max) 
     305    { 
     306        max_size = max; 
     307        digits = new uint32_t[max_size + 1]; 
     308        str = new char[(max_size + 1) * 8 + 1]; 
    308309    } 
    309310 
     
    311312    { 
    312313        msb = 0; 
    313         memset(digits, 0, (MAX_MSG_LEN + 1) * sizeof(uint32_t)); 
     314        memset(digits, 0, (max_size + 1) * sizeof(uint32_t)); 
    314315        digits[0] = i; 
    315316    } 
    316317 
    317318    /* Could be done much faster, but we don't care! */ 
    318     void add(uint32_t x) { add(bitstack(x)); } 
    319     void sub(uint32_t x) { sub(bitstack(x)); } 
     319    void add(uint32_t x) { add(bitstack(max_size, x)); } 
     320    void sub(uint32_t x) { sub(bitstack(max_size, x)); } 
    320321 
    321322    void add(bitstack const &_b) 
     
    410411    } 
    411412 
    412     int msb; 
     413    int msb, max_size; 
    413414    uint32_t *digits; 
    414415    char *str; 
     
    795796int main(int argc, char *argv[]) 
    796797{ 
    797     uint32_t unicode_data[4096]; /* FIXME: allocate this dynamically */ 
     798    uint32_t unicode_data[2048]; 
    798799    int opstats[2 * NB_OPS]; 
    799800    char const *srcname = NULL, *dstname = NULL; 
     
    899900    /* Decoding mode: read UTF-8 text from stdin */ 
    900901    if(dstname) 
    901         for(int i = 0; i < MAX_MSG_LEN; i++) 
    902             unicode_data[i] = fread_utf8(stdin); 
    903  
    904     /* Autodetect charset if decoding, otherwise switch to CJK. */ 
    905     if(!unichars) 
    906     { 
    907         if(dstname) 
    908         { 
    909             if(unicode_data[0] >= 0x0021 && unicode_data[0] < 0x007f) 
    910                 unichars = unichars_ascii; 
    911             else if(unicode_data[0] >= 0x4e00 && unicode_data[0] < 0x9fa6) 
    912                 unichars = unichars_cjk; 
    913             else if(unicode_data[0] >= 0x25a0 && unicode_data[0] < 0x27bf) 
    914                 unichars = unichars_symbols; 
    915             else 
     902        for(MAX_MSG_LEN = 0; ;) 
     903        { 
     904            uint32_t ch = fread_utf8(stdin); 
     905            if(ch == 0xffffffff || ch == '\n') 
     906                break; 
     907            if(ch <= ' ') 
     908                continue; 
     909            unicode_data[MAX_MSG_LEN++] = ch; 
     910 
     911            if(MAX_MSG_LEN >= 2048) 
    916912            { 
    917                 fprintf(stderr, "Error: unable to detect charset\n"); 
     913                fprintf(stderr, "Error: message too long.\n"); 
    918914                return EXIT_FAILURE; 
    919915            } 
    920916        } 
     917 
     918    if(MAX_MSG_LEN == 0) 
     919    { 
     920        fprintf(stderr, "Error: empty message.\n"); 
     921        return EXIT_FAILURE; 
     922    } 
     923 
     924    /* Autodetect charset if decoding, otherwise switch to CJK. */ 
     925    if(dstname) 
     926    { 
     927        char const *charset; 
     928 
     929        if(unicode_data[0] >= 0x0021 && unicode_data[0] < 0x007f) 
     930        { 
     931            unichars = unichars_ascii; 
     932            charset = "ascii"; 
     933        } 
     934        else if(unicode_data[0] >= 0x4e00 && unicode_data[0] < 0x9fa6) 
     935        { 
     936            unichars = unichars_cjk; 
     937            charset = "cjk"; 
     938        } 
     939        else if(unicode_data[0] >= 0x25a0 && unicode_data[0] < 0x27bf) 
     940        { 
     941            unichars = unichars_symbols; 
     942            charset = "symbols"; 
     943        } 
    921944        else 
    922             unichars = unichars_cjk; 
    923     } 
     945        { 
     946            fprintf(stderr, "Error: unable to detect charset\n"); 
     947            return EXIT_FAILURE; 
     948        } 
     949 
     950        if(DEBUG_MODE) 
     951            fprintf(stderr, "Detected charset \"%s\"\n", charset); 
     952    } 
     953    else if(!unichars) 
     954        unichars = unichars_cjk; 
    924955 
    925956    pipi_set_gamma(1.0); 
     
    942973    MAX_ITERATIONS = ITERATIONS_PER_POINT * POINTS_PER_CELL * TOTAL_CELLS; 
    943974 
    944     bitstack b; /* We cannot declare this before, because MAX_MSG_LEN 
    945                  * wouldn't be defined. */ 
     975    bitstack b(MAX_MSG_LEN); /* We cannot declare this before, because 
     976                              * MAX_MSG_LEN wouldn't be defined. */ 
    946977 
    947978    if(dstname) 
     
    9941025    if(DEBUG_MODE) 
    9951026    { 
    996         fprintf(stderr, "Maximum message size: %i\n", MAX_MSG_LEN); 
     1027        fprintf(stderr, "Message size: %i\n", MAX_MSG_LEN); 
    9971028        fprintf(stderr, "Available characters: %i\n", NUM_CHARACTERS); 
    9981029        fprintf(stderr, "Available bits: %f\n", TOTAL_BITS); 
Note: See TracChangeset for help on using the changeset viewer.