diff options
-rw-r--r-- | archival/dpkg.c | 81 |
1 files changed, 50 insertions, 31 deletions
diff --git a/archival/dpkg.c b/archival/dpkg.c index b1aeebf80..8b25bace3 100644 --- a/archival/dpkg.c +++ b/archival/dpkg.c | |||
@@ -502,10 +502,24 @@ void free_package(common_node_t *node) | |||
502 | } | 502 | } |
503 | } | 503 | } |
504 | 504 | ||
505 | /* returns the array number of the string */ | ||
506 | static unsigned short compare_string_array(const char *string_array[], const char *key) | ||
507 | { | ||
508 | unsigned short i; | ||
509 | |||
510 | for (i = 0; string_array[i] != 0; i++) { | ||
511 | if (strcmp(string_array[i], key) == 0) { | ||
512 | break; | ||
513 | } | ||
514 | } | ||
515 | return(i); | ||
516 | } | ||
517 | |||
505 | unsigned int fill_package_struct(char *control_buffer) | 518 | unsigned int fill_package_struct(char *control_buffer) |
506 | { | 519 | { |
507 | common_node_t *new_node = (common_node_t *) xcalloc(1, sizeof(common_node_t)); | 520 | common_node_t *new_node = (common_node_t *) xcalloc(1, sizeof(common_node_t)); |
508 | 521 | const char *field_names[] = { "Package", "Version", "Pre-Depends", "Depends", | |
522 | "Replaces", "Provides", "Conflicts", "Suggests", "Recommends", "Enhances", 0}; | ||
509 | char *field_name; | 523 | char *field_name; |
510 | char *field_value; | 524 | char *field_value; |
511 | int field_start = 0; | 525 | int field_start = 0; |
@@ -514,42 +528,47 @@ unsigned int fill_package_struct(char *control_buffer) | |||
514 | 528 | ||
515 | new_node->version = search_name_hashtable("unknown"); | 529 | new_node->version = search_name_hashtable("unknown"); |
516 | while (field_start < buffer_length) { | 530 | while (field_start < buffer_length) { |
531 | unsigned short field_num; | ||
532 | |||
517 | field_start += read_package_field(&control_buffer[field_start], | 533 | field_start += read_package_field(&control_buffer[field_start], |
518 | &field_name, &field_value); | 534 | &field_name, &field_value); |
519 | 535 | ||
520 | if (field_name == NULL) { | 536 | if (field_name == NULL) { |
521 | goto fill_package_struct_cleanup; // Oh no, the dreaded goto statement !! | 537 | goto fill_package_struct_cleanup; /* Oh no, the dreaded goto statement ! */ |
522 | } | 538 | } |
523 | 539 | ||
524 | if (strcmp(field_name, "Package") == 0) { | 540 | field_num = compare_string_array(field_names, field_name); |
525 | new_node->name = search_name_hashtable(field_value); | 541 | switch(field_num) { |
526 | } | 542 | case 0: /* Package */ |
527 | else if (strcmp(field_name, "Version") == 0) { | 543 | new_node->name = search_name_hashtable(field_value); |
528 | new_node->version = search_name_hashtable(field_value); | 544 | break; |
529 | } | 545 | case 1: /* Version */ |
530 | else if (strcmp(field_name, "Pre-Depends") == 0) { | 546 | new_node->version = search_name_hashtable(field_value); |
531 | add_split_dependencies(new_node, field_value, EDGE_PRE_DEPENDS); | 547 | break; |
532 | } | 548 | case 2: /* Pre-Depends */ |
533 | else if (strcmp(field_name, "Depends") == 0) { | 549 | add_split_dependencies(new_node, field_value, EDGE_PRE_DEPENDS); |
534 | add_split_dependencies(new_node, field_value, EDGE_DEPENDS); | 550 | break; |
535 | } | 551 | case 3: /* Depends */ |
536 | else if (strcmp(field_name, "Replaces") == 0) { | 552 | add_split_dependencies(new_node, field_value, EDGE_DEPENDS); |
537 | add_split_dependencies(new_node, field_value, EDGE_REPLACES); | 553 | break; |
538 | } | 554 | case 4: /* Replaces */ |
539 | else if (strcmp(field_name, "Provides") == 0) { | 555 | add_split_dependencies(new_node, field_value, EDGE_REPLACES); |
540 | add_split_dependencies(new_node, field_value, EDGE_PROVIDES); | 556 | break; |
541 | } | 557 | case 5: /* Provides */ |
542 | else if (strcmp(field_name, "Conflicts") == 0) { | 558 | add_split_dependencies(new_node, field_value, EDGE_PROVIDES); |
543 | add_split_dependencies(new_node, field_value, EDGE_CONFLICTS); | 559 | break; |
544 | } | 560 | case 6: /* Conflicts */ |
545 | else if (strcmp(field_name, "Suggests") == 0) { | 561 | add_split_dependencies(new_node, field_value, EDGE_CONFLICTS); |
546 | add_split_dependencies(new_node, field_value, EDGE_SUGGESTS); | 562 | break; |
547 | } | 563 | case 7: /* Suggests */ |
548 | else if (strcmp(field_name, "Recommends") == 0) { | 564 | add_split_dependencies(new_node, field_value, EDGE_SUGGESTS); |
549 | add_split_dependencies(new_node, field_value, EDGE_RECOMMENDS); | 565 | break; |
550 | } | 566 | case 8: /* Recommends */ |
551 | else if (strcmp(field_name, "Enhances") == 0) { | 567 | add_split_dependencies(new_node, field_value, EDGE_RECOMMENDS); |
552 | add_split_dependencies(new_node, field_value, EDGE_ENHANCES); | 568 | break; |
569 | case 9: /* Enhances */ | ||
570 | add_split_dependencies(new_node, field_value, EDGE_ENHANCES); | ||
571 | break; | ||
553 | } | 572 | } |
554 | fill_package_struct_cleanup: | 573 | fill_package_struct_cleanup: |
555 | if (field_name) { | 574 | if (field_name) { |