aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archival/dpkg.c81
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 */
506static 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
505unsigned int fill_package_struct(char *control_buffer) 518unsigned 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 }
554fill_package_struct_cleanup: 573fill_package_struct_cleanup:
555 if (field_name) { 574 if (field_name) {