Changeset 1228


Ignore:
Timestamp:
Aug 15, 2003, 11:29:31 AM (17 years ago)
Author:
pooh
Message:
  • Read!() fixes.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • to-imperative/trunk/library/StdIO/read.cc

    r1210 r1228  
    3636static wint_t unget_char (FILE* _fp, wint_t _c)
    3737{
    38   char buf[MB_CUR_MAX];
    39   int n = wctomb(buf, _c);
    40   if (n == -1) throw wint_t(WEOF);
    41   while (n > 0) {
    42     if (ungetc(buf[--n], _fp) == EOF) throw wint_t(WEOF);
    43   }
     38  if (_c != WEOF) {
     39    char buf[MB_CUR_MAX];
     40    int n = wctomb(buf, _c);
     41    while (n > 0) {
     42      if (ungetc(buf[--n], _fp) == EOF) break;
     43    }
     44  } else ungetc(EOF, _fp);
    4445  return _c;
    4546}
     
    5859{
    5960  wint_t wc = get_char(_fp);
    60   if (wc == WEOF) throw wc;
     61  if (wc == WEOF) throw wint_t(L'\\');
    6162  switch (wc) {
    6263  case L't': return L'\t';
     
    102103  else if (wc == L'\"') {
    103104    while ((wc = get_char(_fp)) != L'\"') {
    104       if (wc == WEOF) throw wc;
     105      if (wc == WEOF) throw wint_t(L'\"');
    105106      if (wc == L'\\') wc = read_escaped_char(_fp);
    106107      if (i >= sz - 1) {
     
    141142    skip_spaces(_fp);
    142143    wint_t wc = get_char(_fp);
    143     if (wc == WEOF) throw wc;
    144     else if (wc == ')') break;
     144    if (wc == WEOF) throw wint_t(L'(');
     145    else if (wc == L')') break;
    145146    else {
    146147      unget_char(_fp, wc);
     
    161162  case L'\'':
    162163    wc = get_char(_fp);
    163     if (wc == WEOF) throw wc;
     164    if (wc == WEOF) throw wint_t(L'\'');
    164165    if (wc == L'\'') return read_term(_fp);
    165166    else {
     
    204205        return true;
    205206      } catch (wint_t err) {
    206         retfail;
     207        switch (err) {
     208        case WEOF:
     209          retfail;
     210        case 0:
     211          RF_LIB_ERROR("Unknown error");
     212        case L'\'':
     213          RF_LIB_ERROR("Missing right single quote");
     214        case L'\"':
     215          RF_LIB_ERROR("Missing right double quote");
     216        case L'(':
     217          RF_LIB_ERROR("Missing right paren");
     218        case L'\\':
     219          RF_LIB_ERROR("Unexpected EOF reading escaped symbol");
     220        default:
     221          RF_LIB_ERROR("Unexpected symbol on input");
     222        }
    207223      }
    208224      //
Note: See TracChangeset for help on using the changeset viewer.