Changeset 757


Ignore:
Timestamp:
Aug 4, 2007, 2:08:40 AM (13 years ago)
Author:
John Small
Message:
  • A bug was fixed which caused hex literals with the high bit set

to be sign extended.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/dll/literal.c

    r551 r757  
    9595  pszWork = pszOut = xmalloc(cBufBytes + 1, pszSrcFile, __LINE__);
    9696
    97   iBuf = 0;                             /* set index to first character */
     97  iBuf = 0;                                /* set index to first character */
    9898  while (pszBuf[iBuf]) {
    9999    switch (pszBuf[iBuf]) {
    100100    case '\\':
    101101      switch (pszBuf[iBuf + 1]) {
    102       case 'x':                 /* hexadecimal */
    103         wchar = 0;
    104         iBuf += 2;                      /* get past "\x" */
    105         if (index(HEX, (CHAR) toupper(pszBuf[iBuf])) != -1) {
    106           iBufSave = iBuf;
    107           while (((wpos = index(HEX, (CHAR) toupper(pszBuf[iBuf]))) != -1) &&
    108                  iBuf < iBufSave + 2) {
    109             wchar = (CHAR) (wchar << 4) + (CHAR) wpos;
    110             iBuf++;
    111           }
    112         }
    113         else
    114           wchar = 'x';                  /* just an x */
    115         iBuf--;
    116         *pszOut++ = wchar;
    117         break;
    118 
    119       case '\\':                        /* we want a "\" */
    120         iBuf++;
    121         *pszOut++ = '\\';
    122         break;
    123 
    124       case 't':                 /* tab CHAR */
    125         iBuf++;
    126         *pszOut++ = '\t';
    127         break;
    128 
    129       case 'n':                 /* new line */
    130         iBuf++;
    131         *pszOut++ = '\n';
    132         break;
    133 
    134       case 'r':                 /* carr return */
    135         iBuf++;
    136         *pszOut++ = '\r';
    137         break;
    138 
    139       case 'b':                 /* back space */
    140         iBuf++;
    141         *pszOut++ = '\b';
    142         break;
    143 
    144       case 'f':                 /* formfeed */
    145         iBuf++;
    146         *pszOut++ = '\x0c';
    147         break;
    148 
    149       case 'a':                 /* bell */
    150         iBuf++;
    151         *pszOut++ = '\07';
    152         break;
    153 
    154       case '\'':                        /* single quote */
    155         iBuf++;
    156         *pszOut++ = '\'';
    157         break;
    158 
    159       case '\"':                        /* double quote */
    160         iBuf++;
    161         *pszOut++ = '\"';
    162         break;
    163 
    164       default:                          /* decimal */
    165         iBuf++;                         /* get past "\" */
    166         wchar = 0;
    167         if (index(DEC, pszBuf[iBuf]) != -1) {
    168           iBufSave = iBuf;
    169           do {                          /* cvt to binary */
    170             wchar = (CHAR) (wchar * 10 + (pszBuf[iBuf++] - 48));
    171           } while (index(DEC, pszBuf[iBuf]) != -1 && iBuf < iBufSave + 3);
    172           iBuf--;
    173         }
    174         else
    175           wchar = pszBuf[iBuf];
    176         *pszOut++ = wchar;
    177         break;
    178       }                                 // switch
     102      case 'x':                        /* hexadecimal */
     103        wchar = 0;
     104        iBuf += 2;                        /* get past "\x" */
     105        if (index(HEX, (CHAR) toupper(pszBuf[iBuf])) != -1) {
     106          iBufSave = iBuf;
     107          while (((wpos = index(HEX, (CHAR) toupper(pszBuf[iBuf]))) != -1) &&
     108                 iBuf < iBufSave + 2) {
     109            wchar = (CHAR) (wchar << 4) + (CHAR) wpos;
     110            iBuf++;
     111          }
     112        }
     113        else
     114          wchar = 'x';                        /* just an x */
     115        iBuf--;
     116        *pszOut++ = wchar;
     117        break;
     118
     119      case '\\':                        /* we want a "\" */
     120        iBuf++;
     121        *pszOut++ = '\\';
     122        break;
     123
     124      case 't':                        /* tab CHAR */
     125        iBuf++;
     126        *pszOut++ = '\t';
     127        break;
     128
     129      case 'n':                        /* new line */
     130        iBuf++;
     131        *pszOut++ = '\n';
     132        break;
     133
     134      case 'r':                        /* carr return */
     135        iBuf++;
     136        *pszOut++ = '\r';
     137        break;
     138
     139      case 'b':                        /* back space */
     140        iBuf++;
     141        *pszOut++ = '\b';
     142        break;
     143
     144      case 'f':                        /* formfeed */
     145        iBuf++;
     146        *pszOut++ = '\x0c';
     147        break;
     148
     149      case 'a':                        /* bell */
     150        iBuf++;
     151        *pszOut++ = '\07';
     152        break;
     153
     154      case '\'':                        /* single quote */
     155        iBuf++;
     156        *pszOut++ = '\'';
     157        break;
     158
     159      case '\"':                        /* double quote */
     160
     161        iBuf++;
     162        *pszOut++ = '\"';
     163        break;
     164
     165      default:                                /* decimal */
     166        iBuf++;                                /* get past "\" */
     167        wchar = 0;
     168        if (index(DEC, pszBuf[iBuf]) != -1) {
     169          iBufSave = iBuf;
     170          do {                                /* cvt to binary */
     171            wchar = (CHAR) (wchar * 10 + (pszBuf[iBuf++] - 48));
     172          } while (index(DEC, pszBuf[iBuf]) != -1 && iBuf < iBufSave + 3);
     173          iBuf--;
     174        }
     175        else
     176          wchar = pszBuf[iBuf];
     177        *pszOut++ = wchar;
     178        break;
     179      }                                        // switch
    179180      break;
    180181
     
    182183      *pszOut++ = pszBuf[iBuf];
    183184      break;
    184     }                                   // switch
     185    }                                        // switch
    185186    iBuf++;
    186   }                                     // while
    187   *pszOut = 0;                          /* Always terminate, even if not string */
    188 
    189   cBufBytes = pszOut - pszWork;         /* Calc string length excluding terminator */
    190   memcpy(pszBuf, pszWork, cBufBytes + 1);       /* Overwrite including terminator */
     187  }                                        // while
     188  *pszOut = 0;                                /* Always terminate, even if not string */
     189
     190  cBufBytes = pszOut - pszWork;                /* Calc string length excluding terminator */
     191  memcpy(pszBuf, pszWork, cBufBytes + 1);        /* Overwrite including terminator */
    191192  free(pszWork);
    192193
    193   return cBufBytes;                     /* Return string length */
     194  return cBufBytes;                        /* Return string length */
    194195}
    195196
     
    202203
    203204BOOL wildcard(const PSZ pszBuf, const PSZ pszWildCard,
    204               const BOOL fNotFileSpec)
     205              const BOOL fNotFileSpec)
    205206{
    206207  const CHAR *fstr = pszBuf;
     
    210211  while (wmatch && *fcard && *fstr) {
    211212    switch (*fcard) {
    212     case '?':                           /* character substitution */
     213    case '?':                                /* character substitution */
    213214      fcard++;
    214215      if (fNotFileSpec || (*fstr != '.' && *fstr != '/' && *fstr != '\\'))
    215         fstr++;                         /* skip (match) next character */
     216        fstr++;                                /* skip (match) next character */
    216217      break;
    217218
     
    219220      /* find next non-wild character in wildcard */
    220221      while (*fcard && (*fcard == '?' || *fcard == '*'))
    221         fcard++;
    222       if (!*fcard)                      /* if last char of wildcard is *, it matches */
    223         return TRUE;
     222        fcard++;
     223      if (!*fcard)                        /* if last char of wildcard is *, it matches */
     224        return TRUE;
    224225      /* skip until partition, match, or eos */
    225226      while (*fstr && toupper(*fstr) != toupper(*fcard) &&
    226              (fNotFileSpec || (*fstr != '\\' &&
    227                                *fstr != '/' && *fstr != '.')))
    228         fstr++;
    229       if (!fNotFileSpec && !*fstr)      /* implicit '.' */
    230         if (*fcard == '.')
    231           fcard++;
     227             (fNotFileSpec || (*fstr != '\\' &&
     228                               *fstr != '/' && *fstr != '.')))
     229        fstr++;
     230      if (!fNotFileSpec && !*fstr)        /* implicit '.' */
     231        if (*fcard == '.')
     232          fcard++;
    232233      break;
    233234
    234235    default:
    235236      if (!fNotFileSpec && ((*fstr == '/' || *fstr == '\\') &&
    236                             (*fcard == '/' || *fcard == '\\')))
    237         wmatch = TRUE;
     237                            (*fcard == '/' || *fcard == '\\')))
     238        wmatch = TRUE;
    238239      else
    239         wmatch = (toupper(*fstr) == toupper(*fcard));
     240        wmatch = (toupper(*fstr) == toupper(*fcard));
    240241      fstr++;
    241242      fcard++;
     
    253254
    254255PSZ fixup(const PCH pachIn, PSZ pszOutBuf, const UINT cBufBytes,
    255           const UINT cInBytes)
     256          const UINT cInBytes)
    256257{
    257258  PCH pchIn = pachIn;
    258259  PCH pchOut = pszOutBuf;
    259260  PSZ pszTemp;
    260   static CHAR szTemp[5] = "\\x";        // Constant prefix
     261  static CHAR szTemp[5] = "\\x";        // Constant prefix
    261262
    262263  // input is a character array, not a string - may not be null terminated
     
    266267    while (pchIn - pachIn < cInBytes && pchOut - pszOutBuf + 2 < cBufBytes) {
    267268      if (!isprint(*pchIn)) {
    268         if (*pchIn == '\r') {
    269           *pchOut++ = '\\';
    270           *pchOut++ = 'r';
    271         }
    272         else if (*pchIn == '\n') {
    273           *pchOut++ = '\\';
    274           *pchOut++ = 'n';
    275         }
    276         else if (*pchIn == '\b') {
    277           *pchOut++ = '\\';
    278           *pchOut++ = 'b';
    279         }
    280         else {
    281           sprintf(szTemp + 2, "%02hx", *pchIn);
    282           for (pszTemp = szTemp; *pszTemp;)
    283             *pchOut++ = *pszTemp++;
    284         }
    285         pchIn++;
     269        if (*pchIn == '\r') {
     270          *pchOut++ = '\\';
     271          *pchOut++ = 'r';
     272        }
     273        else if (*pchIn == '\n') {
     274          *pchOut++ = '\\';
     275          *pchOut++ = 'n';
     276        }
     277        else if (*pchIn == '\b') {
     278          *pchOut++ = '\\';
     279          *pchOut++ = 'b';
     280        }
     281        else {
     282          sprintf(szTemp + 2, "%02hhx", *pchIn);
     283          for (pszTemp = szTemp; *pszTemp;)
     284            *pchOut++ = *pszTemp++;
     285        }
     286        pchIn++;
    286287      }
    287288      else if (*pchIn == '\\') {
    288         *pchOut++ = '\\';
    289         *pchOut++ = '\\';
    290         pchIn++;
     289        *pchOut++ = '\\';
     290        *pchOut++ = '\\';
     291        pchIn++;
    291292      }
    292293      else
    293         *pchOut++ = *pchIn++;
    294     }                                   // while
    295   }                                     // if pachIn
     294        *pchOut++ = *pchIn++;
     295    }                                        // while
     296  }                                        // if pachIn
    296297  *pchOut = 0;
    297298  return pszOutBuf;
Note: See TracChangeset for help on using the changeset viewer.