Changeset 3935


Ignore:
Timestamp:
01/23/08 13:34:44 (5 years ago)
Author:
thomas
Message:

opkg: apply "1-pkg-parse--Optimize-inefficient-parsing.patch" from OpenEmbedded?

pkg_parse: Optimize inefficient parsing. Instead of expensively probing all
fields in row, dispatch based on the first letter of the field. Tests show ~12
times reduction in number of calls to low-level parsing functions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/target/opkg/pkg_parse.c

    r3880 r3935  
    242242    for (lines = *raw; *lines; lines++) { 
    243243        /*      fprintf(stderr, "PARSING %s\n", *lines);*/ 
    244         if(isGenericFieldType("Package:", *lines))  
    245             pkg->name = parseGenericFieldType("Package", *lines); 
    246         else if(isGenericFieldType("Architecture:", *lines)) 
    247             pkg->architecture = parseGenericFieldType("Architecture", *lines); 
    248         else if(isGenericFieldType("Filename:", *lines)) 
    249             pkg->filename = parseGenericFieldType("Filename", *lines); 
    250         else if(isGenericFieldType("Section:", *lines)) 
    251             pkg->section = parseGenericFieldType("Section", *lines); 
    252         else if(isGenericFieldType("MD5sum:", *lines)) 
    253             pkg->md5sum = parseGenericFieldType("MD5sum", *lines); 
    254         /* The old opkg wrote out status files with the wrong case for MD5sum, 
    255            let's parse it either way */ 
    256         else if(isGenericFieldType("MD5Sum:", *lines)) 
    257             pkg->md5sum = parseGenericFieldType("MD5Sum", *lines); 
    258         else if(isGenericFieldType("Size:", *lines)) 
    259             pkg->size = parseGenericFieldType("Size", *lines); 
    260         else if(isGenericFieldType("Source:", *lines)) 
    261             pkg->source = parseGenericFieldType("Source", *lines); 
    262         else if(isGenericFieldType("Installed-Size:", *lines)) 
    263             pkg->installed_size = parseGenericFieldType("Installed-Size", *lines); 
    264         else if(isGenericFieldType("Installed-Time:", *lines)) { 
    265              char *time_str = parseGenericFieldType("Installed-Time", *lines); 
    266              pkg->installed_time = strtoul(time_str, NULL, 0); 
    267         } else if(isGenericFieldType("Priority:", *lines)) 
    268             pkg->priority = parseGenericFieldType("Priority", *lines); 
    269         else if(isGenericFieldType("Essential:", *lines)) { 
    270             char *essential_value; 
    271             essential_value = parseGenericFieldType("Essential", *lines); 
    272             if (strcmp(essential_value, "yes") == 0) { 
    273                 pkg->essential = 1; 
    274             } 
    275             free(essential_value); 
    276         } 
    277         else if(isGenericFieldType("Status", *lines)) 
    278             parseStatus(pkg, *lines); 
    279         else if(isGenericFieldType("Version", *lines)) 
    280             parseVersion(pkg, *lines); 
    281         else if(isGenericFieldType("Maintainer", *lines)) 
    282             pkg->maintainer = parseGenericFieldType("Maintainer", *lines); 
    283         else if(isGenericFieldType("Conffiles", *lines)){ 
    284             parseConffiles(pkg, *lines); 
    285             reading_conffiles = 1; 
    286         } 
    287         else if(isGenericFieldType("Description", *lines)) { 
    288             pkg->description = parseGenericFieldType("Description", *lines); 
    289             reading_conffiles = 0; 
    290             reading_description = 1; 
    291         } 
    292  
    293         else if(isGenericFieldType("Provides", *lines)){ 
     244        switch (**lines) { 
     245        case 'P': 
     246            if(isGenericFieldType("Package:", *lines))  
     247                pkg->name = parseGenericFieldType("Package", *lines); 
     248            else if(isGenericFieldType("Priority:", *lines)) 
     249                pkg->priority = parseGenericFieldType("Priority", *lines); 
     250            else if(isGenericFieldType("Provides", *lines)){ 
    294251/* Here we add the internal_use to align the off by one problem between provides_str and provides */ 
    295             provide = (char * ) malloc(strlen(*lines)+ 35 ); /* Preparing the space for the new opkg_internal_use_only */ 
    296             if ( alterProvidesLine(*lines,provide) ){ 
    297                return EINVAL; 
    298             } 
    299             pkg->provides_str = parseDependsString( provide, &pkg->provides_count); 
     252                provide = (char * ) malloc(strlen(*lines)+ 35 ); /* Preparing the space for the new opkg_internal_use_only */ 
     253                if ( alterProvidesLine(*lines,provide) ){ 
     254                    return EINVAL; 
     255                } 
     256                pkg->provides_str = parseDependsString( provide, &pkg->provides_count); 
    300257/* Let's try to hack a bit here. 
    301258   The idea is that if a package has no Provides, we would add one generic, to permit the check of dependencies 
    302259   in alot of other places. We will remove it before writing down the status database */ 
    303             pkg_false_provides=0; 
    304             free(provide); 
    305         }  
    306  
    307         else if(isGenericFieldType("Depends", *lines)) 
    308             pkg->depends_str = parseDependsString(*lines, &pkg->depends_count); 
    309         else if(isGenericFieldType("Pre-Depends", *lines)) 
    310             pkg->pre_depends_str = parseDependsString(*lines, &pkg->pre_depends_count); 
    311         else if(isGenericFieldType("Recommends", *lines)) 
    312             pkg->recommends_str = parseDependsString(*lines, &pkg->recommends_count); 
    313         else if(isGenericFieldType("Suggests", *lines)) 
    314             pkg->suggests_str = parseDependsString(*lines, &pkg->suggests_count); 
    315         /* Abhaya: support for conflicts */ 
    316         else if(isGenericFieldType("Conflicts", *lines)) 
    317             pkg->conflicts_str = parseDependsString(*lines, &pkg->conflicts_count); 
    318         else if(isGenericFieldType("Replaces", *lines)) 
    319             pkg->replaces_str = parseDependsString(*lines, &pkg->replaces_count); 
    320         else if(line_is_blank(*lines)) { 
    321             lines++; 
    322             break; 
    323         } 
    324         else if(**lines == ' '){ 
     260                pkg_false_provides=0; 
     261                free(provide); 
     262            }  
     263            else if(isGenericFieldType("Pre-Depends", *lines)) 
     264                pkg->pre_depends_str = parseDependsString(*lines, &pkg->pre_depends_count); 
     265            break; 
     266 
     267        case 'A': 
     268            if(isGenericFieldType("Architecture:", *lines)) 
     269                pkg->architecture = parseGenericFieldType("Architecture", *lines); 
     270            break; 
     271 
     272        case 'F': 
     273            if(isGenericFieldType("Filename:", *lines)) 
     274                pkg->filename = parseGenericFieldType("Filename", *lines); 
     275            break; 
     276 
     277        case 'S': 
     278            if(isGenericFieldType("Section:", *lines)) 
     279                pkg->section = parseGenericFieldType("Section", *lines); 
     280            else if(isGenericFieldType("Size:", *lines)) 
     281                pkg->size = parseGenericFieldType("Size", *lines); 
     282            else if(isGenericFieldType("Source:", *lines)) 
     283                pkg->source = parseGenericFieldType("Source", *lines); 
     284            else if(isGenericFieldType("Status", *lines)) 
     285                parseStatus(pkg, *lines); 
     286            else if(isGenericFieldType("Suggests", *lines)) 
     287                pkg->suggests_str = parseDependsString(*lines, &pkg->suggests_count); 
     288            break; 
     289 
     290        case 'M': 
     291            if(isGenericFieldType("MD5sum:", *lines)) 
     292                pkg->md5sum = parseGenericFieldType("MD5sum", *lines); 
     293            /* The old opkg wrote out status files with the wrong case for MD5sum, 
     294                let's parse it either way */ 
     295            else if(isGenericFieldType("MD5Sum:", *lines)) 
     296                pkg->md5sum = parseGenericFieldType("MD5Sum", *lines); 
     297            else if(isGenericFieldType("Maintainer", *lines)) 
     298                pkg->maintainer = parseGenericFieldType("Maintainer", *lines); 
     299            break; 
     300 
     301        case 'I': 
     302            if(isGenericFieldType("Installed-Size:", *lines)) 
     303                pkg->installed_size = parseGenericFieldType("Installed-Size", *lines); 
     304            else if(isGenericFieldType("Installed-Time:", *lines)) { 
     305                char *time_str = parseGenericFieldType("Installed-Time", *lines); 
     306                pkg->installed_time = strtoul(time_str, NULL, 0); 
     307            }        
     308            break; 
     309 
     310        case 'E': 
     311            if(isGenericFieldType("Essential:", *lines)) { 
     312                char *essential_value; 
     313                essential_value = parseGenericFieldType("Essential", *lines); 
     314                if (strcmp(essential_value, "yes") == 0) { 
     315                    pkg->essential = 1; 
     316                } 
     317                free(essential_value); 
     318            } 
     319            break; 
     320 
     321        case 'V': 
     322            if(isGenericFieldType("Version", *lines)) 
     323                parseVersion(pkg, *lines); 
     324            break; 
     325 
     326        case 'C': 
     327            if(isGenericFieldType("Conffiles", *lines)){ 
     328                parseConffiles(pkg, *lines); 
     329                reading_conffiles = 1; 
     330            } 
     331            else if(isGenericFieldType("Conflicts", *lines)) 
     332                pkg->conflicts_str = parseDependsString(*lines, &pkg->conflicts_count); 
     333            break; 
     334 
     335        case 'D': 
     336            if(isGenericFieldType("Description", *lines)) { 
     337                pkg->description = parseGenericFieldType("Description", *lines); 
     338                reading_conffiles = 0; 
     339                reading_description = 1; 
     340            } 
     341            else if(isGenericFieldType("Depends", *lines)) 
     342                pkg->depends_str = parseDependsString(*lines, &pkg->depends_count); 
     343            break; 
     344 
     345        case 'R': 
     346            if(isGenericFieldType("Recommends", *lines)) 
     347                pkg->recommends_str = parseDependsString(*lines, &pkg->recommends_count); 
     348            else if(isGenericFieldType("Replaces", *lines)) 
     349                pkg->replaces_str = parseDependsString(*lines, &pkg->replaces_count); 
     350             
     351            break; 
     352 
     353        case ' ': 
    325354            if(reading_description) { 
    326355                /* we already know it's not blank, so the rest of description */       
     
    333362            else if(reading_conffiles) 
    334363                parseConffiles(pkg, *lines); 
     364                 
     365            break; 
     366 
     367        default: 
     368            if(line_is_blank(*lines)) { 
     369                lines++; 
     370                goto out; 
     371            } 
    335372        } 
    336373    } 
     374out:; 
     375     
    337376    *raw = lines; 
    338377/* If the ipk has not a Provides line, we insert our false line */  
Note: See TracChangeset for help on using the changeset viewer.