Changeset 3033:a3426e8335fb in roaraudio for libroar/vio_string.c


Ignore:
Timestamp:
11/07/09 13:59:55 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

wrote lseek based optimized fgets()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/vio_string.c

    r3031 r3033  
    6161 
    6262char *  roar_vio_fgets   (struct roar_vio_calls * vio, char * s, size_t size) { 
    63  size_t have = 0; 
    64  char   cur; 
     63 size_t  have = 0; 
     64 size_t  need = size; 
     65 ssize_t ret; 
     66 char    cur; 
     67 char    buf[1024]; 
     68 off_t   offs; 
     69 char  * eol; 
    6570 
    6671 if ( size == 0 ) 
     
    7378 size -= 1; 
    7479 
    75 /* 
    76  if ( roar_vio_lseek(vio, 0, SEEK_CUR) == (off_t)-1 ) { 
    77 */ 
     80 if ( (offs = roar_vio_lseek(vio, 0, SEEK_CUR)) == (off_t)-1 ) { 
    7881  // need to use the one byte at a time methode 
    7982  while ( have < size ) { 
     
    8790    break; 
    8891  } 
    89 /* 
    9092 } else { 
    9193  // can use the optimized version 
     94  eol = NULL; 
     95 
     96  memset(s, '+', size); 
     97 
     98  while ( have < size && eol == NULL ) { 
     99   ret = roar_vio_read(vio, buf, need > 1023 ? 1023 : need); 
     100 
     101   if ( ret == -1 || ret == 0 ) 
     102    break; 
     103 
     104   ROAR_DBG("roar_vio_fgets(*): have=%u", (unsigned int) have); 
     105 
     106   buf[1023] = 0; 
     107   if ( (eol = strstr(buf, "\n")) == NULL ) { 
     108    memcpy(s, buf, ret); 
     109    s    += ret; 
     110    have += ret; 
     111    need -= ret; 
     112   } else { 
     113    offs = eol - buf - ret + 1; 
     114    if ( roar_vio_lseek(vio, offs, SEEK_CUR) == -1 ) 
     115     return NULL; 
     116 
     117    ROAR_DBG("roar_vio_fgets(*): have=%u", (unsigned int) have); 
     118    ROAR_DBG("roar_vio_fgets(*): eol - buf=%lli", (long long) (eol - buf)); 
     119 
     120    ret = (size_t)(eol - buf); 
     121    ret++; 
     122    ROAR_DBG("roar_vio_fgets(*): ret=%lli", (long long) ret); 
     123 
     124    memcpy(s, buf, ret); 
     125    have += ret; 
     126 
     127    ROAR_DBG("roar_vio_fgets(*): have=%u", (unsigned int) have); 
     128 
     129    break; 
     130   } 
     131   ROAR_DBG("roar_vio_fgets(*): have=%u", (unsigned int) have); 
     132  } 
     133 
    92134 } 
    93 */ 
     135 
     136 ROAR_DBG("roar_vio_fgets(*): have=%u", (unsigned int) have); 
    94137 
    95138 if ( !have ) 
Note: See TracChangeset for help on using the changeset viewer.