Ignore:
Timestamp:
Nov 12, 2006, 11:06:35 AM (13 years ago)
Author:
Sam Hocevar
Message:
  • Properly handle EOF in cacaplay.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/src/cacaplay.c

    r1352 r1355  
    3333    caca_display_t *dp;
    3434    unsigned char *buf = NULL;
    35     long int bytes, total = 0;
     35    long int bytes = 0, total = 0;
    3636    int fd;
    3737
     
    5959        caca_event_t ev;
    6060        int ret = caca_get_event(dp, CACA_EVENT_ANY, &ev, 0);
     61        int eof = 0;
    6162
    6263        if(ret && ev.type & CACA_EVENT_KEY_PRESS)
    6364            break;
     65
     66        if(bytes == 0)
     67        {
     68            ssize_t n;
     69            buf = realloc(buf, total + 1);
     70            n = read(fd, buf + total, 1);
     71            if(n < 0)
     72            {
     73                fprintf(stderr, "%s: read error\n", argv[0]);
     74                return -1;
     75            }
     76            else if(n == 0)
     77            {
     78                eof = 1;
     79            }
     80            total += n;
     81        }
    6482
    6583        bytes = cucul_import_memory(app, buf, total, "caca");
     
    7391            caca_refresh_display(dp);
    7492        }
    75         else if(bytes == 0)
    76         {
    77             ssize_t n;
    78             buf = realloc(buf, total + 128);
    79             n = read(fd, buf + total, 128);
    80             if(n < 0)
    81             {
    82                 fprintf(stderr, "%s: read error\n", argv[0]);
    83                 return -1;
    84             }
    85             total += n;
    86         }
    87         else /* bytes < 0 */
     93        else if(bytes < 0)
    8894        {
    8995            fprintf(stderr, "%s: corrupted caca file\n", argv[0]);
    90             return -1;
     96            break;
    9197        }
     98
     99        if(eof)
     100            break;
    92101    }
     102
     103    caca_get_event(dp, CACA_EVENT_KEY_PRESS, NULL, -1);
    93104
    94105    /* Clean up */
Note: See TracChangeset for help on using the changeset viewer.