Changeset 987:8515cd4f20f7 for charset.c

Show
Ignore:
Timestamp:
1999-03-30 16:11:03 (10 years ago)
Author:
Thomas Roessler <roessler@…>
Branch:
HEAD
Message:

A couple of optimizations, most notably for the special case of a
non-prefix state.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • charset.c

    r985 r987  
    910910void mutt_decoder_push (DECODER *d, void *_buff, size_t blen, size_t *taken) 
    911911{ 
     912  struct decoder_buff *b; 
     913   
    912914  if (!_buff || !blen) 
    913915  { 
     
    915917    return; 
    916918  } 
    917  
    918   if ((*taken = MIN(blen, d->in.size - d->in.used))) 
    919   { 
    920     memcpy (d->in.buff + d->in.used, _buff, *taken); 
    921     d->in.used += *taken; 
    922   } 
    923 } 
    924  
     919   
     920  /* shortcut the identity mapping and save one copying pass */ 
     921   
     922  if (d->just_take_id) 
     923    b = &d->out; 
     924  else 
     925    b = &d->in; 
     926     
     927  if ((*taken = MIN(blen, b->size - b->used))) 
     928  { 
     929    memcpy (b->buff + b->used, _buff, *taken); 
     930    b->used += *taken; 
     931  } 
     932} 
     933 
     934int mutt_decoder_push_one (DECODER *d, char c) 
     935{ 
     936  struct decoder_buff *b; 
     937 
     938  if (d->just_take_id) 
     939    b = &d->out; 
     940  else 
     941    b = &d->in; 
     942 
     943  if (b->used == b->size) 
     944    return -1; 
     945   
     946  b->buff[b->used++] = c; 
     947  return 0; 
     948} 
    925949 
    926950void mutt_decoder_pop (DECODER *d, void *_buff, size_t blen, size_t *popped) 
     
    942966  char tmp[DECODER_BUFFSIZE]; 
    943967  size_t i, l; 
    944    
    945   do  
    946   { 
    947     mutt_decoder_pop (d, tmp, sizeof (tmp), &l); 
    948     for (i = 0; i < l; i++) 
    949       state_prefix_putc (tmp[i], s); 
    950   } 
    951   while (l > 0); 
     968 
     969  if (s->prefix) 
     970  { 
     971    do  
     972    { 
     973      mutt_decoder_pop (d, tmp, sizeof (tmp), &l); 
     974      for (i = 0; i < l; i++) 
     975        state_prefix_putc (tmp[i], s); 
     976    } 
     977    while (l > 0); 
     978  } 
     979  else 
     980  { 
     981    do  
     982    { 
     983      mutt_decoder_pop (d, tmp, sizeof (tmp), &l); 
     984      fwrite (tmp, l, 1, s->fpout); 
     985    } 
     986    while (l > 0); 
     987  } 
    952988} 
    953989 
     
    10111047  if (force) d->forced = 1; 
    10121048   
    1013   if (d->just_take_id) 
    1014   { 
    1015     size_t l = MIN (d->out.size - d->out.used, d->in.used); 
    1016     memmove (d->out.buff + d->out.used, d->in.buff, l); 
    1017     memmove (d->in.buff, d->in.buff + l, d->in.used - l); 
    1018     d->in.used -= l; 
    1019     d->out.used += l; 
    1020   } 
    1021   else if (d->src_is_utf8) 
    1022     _process_data_utf8 (d); 
    1023   else 
    1024     _process_data_8bit (d); 
     1049  if (!d->just_take_id) 
     1050  { 
     1051    if (d->src_is_utf8) 
     1052      _process_data_utf8 (d); 
     1053    else 
     1054      _process_data_8bit (d); 
     1055  } 
    10251056} 
    10261057