Changeset 3527


Ignore:
Timestamp:
May 27, 2009 7:04:17 AM (6 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.