Changeset 2233 for trunk


Ignore:
Timestamp:
Jul 8, 2005, 2:42:50 AM (20 years ago)
Author:
bird
Message:

Removed assumption about the order of name table entries.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/emx/src/emximp/emximp.c

    • Property cvs2svn:cvs-rev changed from 1.14 to 1.15
    r2232 r2233  
    12501250 * Reads a LX nametable.
    12511251 */
    1252 static void dll_read_names(FILE *phFile, off_t off, int fResident, int fOrdinal0Only, const char *pszFilename)
     1252static void dll_read_names(FILE *phFile, off_t off, int cb, int fResident, int fOrdinal0Only, const char *pszFilename)
    12531253{
    12541254    char            szName[256];
     
    12591259        error("`%s': Bad LX format\n", pszFilename);
    12601260
    1261 
    1262     /* first name is module name / description. */
    1263     cchName = (unsigned)fgetc(phFile);
    1264     if (!cchName)
    1265         error("`%s': Bad LX format\n", pszFilename);
    1266     iOrd = 0;
    1267     if (    fread(szName, 1, cchName, phFile) != cchName
    1268         ||  fread(&iOrd, 1, 2, phFile) != 2)
    1269         error("`%s': Bad LX format\n", pszFilename);
    1270     if (iOrd != 0)
    1271         error("`%s': Bad LX format - expect 0 as first ordinal, found %d\n", pszFilename, iOrd);
    1272 
    1273     szName[cchName] = '\0';
    12741261    if (fResident)
    1275         module_name = xstrdup(szName);
     1262        module_name = NULL;
    12761263    else
    1277         description = xstrdup(szName);
    1278 
    1279     if (fOrdinal0Only)
    1280         return;
    1281 
    1282     /* The rest of the names are export names. */
    1283     for (;;)
     1264        description = NULL;
     1265
     1266    /* The names doesn't have to be in order, so we'll have to read
     1267     * until we find the 0 ordinal if that's what we require. */
     1268    while (cb > 0)
    12841269    {
    12851270        cchName = (unsigned)fgetc(phFile);
    1286         if (!cchName)
     1271        if (!cchName || cb < cchName + 2)
    12871272            break;
    12881273        iOrd = 0;
     
    12911276            error("`%s': Bad LX format\n", pszFilename);
    12921277        szName[cchName] = '\0';
    1293 
    1294         switch (mode)
     1278        cb -= 1 + cchName + 2;
     1279
     1280        if (iOrd == 0)
    12951281        {
    1296             case M_DLL_TO_IMP:
    1297                 if (!fResident)
    1298                     fprintf(out_file, "%-23s %-8s %3u ?\n",   szName, module_name, iOrd);
    1299                 else
    1300                     fprintf(out_file, "%-23s %-8s %-23s ?\n", szName, module_name, szName);
    1301                 if (ferror(out_file))
    1302                     write_error(out_fname);
    1303                 break;
    1304             case M_DLL_TO_A:
    1305                 if (!fResident)
    1306                     write_a_import(szName, module_name, iOrd, NULL);
    1307                 else
    1308                     write_a_import(szName, module_name, 0, szName);
    1309                 break;
    1310             case M_DLL_TO_LIB:
    1311                 if (!fResident)
    1312                     write_lib_import(szName, module_name, iOrd, NULL);
    1313                 else
    1314                     write_lib_import(szName, module_name, 0, szName);
    1315                 break;
    1316             case M_DLL_TO_DEF:
    1317                 if (!fResident)
    1318                     fprintf(out_file, "  \"%s\" @%d\n", szName, iOrd);
    1319                 else
    1320                     fprintf(out_file, "  \"%s\"\n", szName);
    1321                 if (ferror(out_file))
    1322                     write_error(out_fname);
    1323                 break;
    1324             default:
    1325                 abort ();
     1282            if (fResident)
     1283                module_name = xstrdup(szName);
     1284            else
     1285                description = xstrdup(szName);
     1286            if (fOrdinal0Only)
     1287                return;
     1288        }
     1289        else if (!fOrdinal0Only)
     1290        {
     1291            switch (mode)
     1292            {
     1293                case M_DLL_TO_IMP:
     1294                    if (!fResident)
     1295                        fprintf(out_file, "%-23s %-8s %3u ?\n",   szName, module_name, iOrd);
     1296                    else
     1297                        fprintf(out_file, "%-23s %-8s %-23s ?\n", szName, module_name, szName);
     1298                    if (ferror(out_file))
     1299                        write_error(out_fname);
     1300                    break;
     1301                case M_DLL_TO_A:
     1302                    if (!fResident)
     1303                        write_a_import(szName, module_name, iOrd, NULL);
     1304                    else
     1305                        write_a_import(szName, module_name, 0, szName);
     1306                    break;
     1307                case M_DLL_TO_LIB:
     1308                    if (!fResident)
     1309                        write_lib_import(szName, module_name, iOrd, NULL);
     1310                    else
     1311                        write_lib_import(szName, module_name, 0, szName);
     1312                    break;
     1313                case M_DLL_TO_DEF:
     1314                    if (!fResident)
     1315                        fprintf(out_file, "  \"%s\" @%d\n", szName, iOrd);
     1316                    else
     1317                        fprintf(out_file, "  \"%s\"\n", szName);
     1318                    if (ferror(out_file))
     1319                        write_error(out_fname);
     1320                    break;
     1321                default:
     1322                    abort ();
     1323            }
    13261324        }
    13271325    } /* read restable loop */
     
    14431441    if (mode == M_DLL_TO_DEF && !first_module)
    14441442    {
    1445         dll_read_names(phFile, os2hdr.e32_restab + offLX, 1, 1, pszFilename);
    1446         dll_read_names(phFile, os2hdr.e32_nrestab, 0, 1, pszFilename);
     1443        dll_read_names(phFile, os2hdr.e32_restab + offLX, 0x7ffffff, 1, 1, pszFilename);
     1444        dll_read_names(phFile, os2hdr.e32_nrestab, os2hdr.e32_cbnrestab, 0, 1, pszFilename);
    14471445
    14481446        first_module = xstrdup(module_name);
     
    14571455          write_error(out_fname);
    14581456    }
    1459     dll_read_names(phFile, os2hdr.e32_restab + offLX, 1, 0, pszFilename);
     1457    dll_read_names(phFile, os2hdr.e32_restab + offLX, 0x7ffffff, 1, 0, pszFilename);
    14601458    if (os2hdr.e32_nrestab)
    1461         dll_read_names(phFile, os2hdr.e32_nrestab, 0, 0, pszFilename);
     1459        dll_read_names(phFile, os2hdr.e32_nrestab, os2hdr.e32_cbnrestab, 0, 0, pszFilename);
    14621460
    14631461    fclose(phFile);
Note: See TracChangeset for help on using the changeset viewer.