463 if (result == NULL) return false; |
463 if (result == NULL) return false; |
464 if (!result->is_ccstr()) return false; |
464 if (!result->is_ccstr()) return false; |
465 ccstr old_value = result->get_ccstr(); |
465 ccstr old_value = result->get_ccstr(); |
466 char* new_value = NULL; |
466 char* new_value = NULL; |
467 if (*value != NULL) { |
467 if (*value != NULL) { |
468 new_value = NEW_C_HEAP_ARRAY(char, strlen(*value)+1); |
468 new_value = NEW_C_HEAP_ARRAY(char, strlen(*value)+1, mtInternal); |
469 strcpy(new_value, *value); |
469 strcpy(new_value, *value); |
470 } |
470 } |
471 result->set_ccstr(new_value); |
471 result->set_ccstr(new_value); |
472 if (result->origin == DEFAULT && old_value != NULL) { |
472 if (result->origin == DEFAULT && old_value != NULL) { |
473 // Prior value is NOT heap allocated, but was a literal constant. |
473 // Prior value is NOT heap allocated, but was a literal constant. |
474 char* old_value_to_free = NEW_C_HEAP_ARRAY(char, strlen(old_value)+1); |
474 char* old_value_to_free = NEW_C_HEAP_ARRAY(char, strlen(old_value)+1, mtInternal); |
475 strcpy(old_value_to_free, old_value); |
475 strcpy(old_value_to_free, old_value); |
476 old_value = old_value_to_free; |
476 old_value = old_value_to_free; |
477 } |
477 } |
478 *value = old_value; |
478 *value = old_value; |
479 result->origin = origin; |
479 result->origin = origin; |
483 // Contract: Flag will make private copy of the incoming value. |
483 // Contract: Flag will make private copy of the incoming value. |
484 void CommandLineFlagsEx::ccstrAtPut(CommandLineFlagWithType flag, ccstr value, FlagValueOrigin origin) { |
484 void CommandLineFlagsEx::ccstrAtPut(CommandLineFlagWithType flag, ccstr value, FlagValueOrigin origin) { |
485 Flag* faddr = address_of_flag(flag); |
485 Flag* faddr = address_of_flag(flag); |
486 guarantee(faddr != NULL && faddr->is_ccstr(), "wrong flag type"); |
486 guarantee(faddr != NULL && faddr->is_ccstr(), "wrong flag type"); |
487 ccstr old_value = faddr->get_ccstr(); |
487 ccstr old_value = faddr->get_ccstr(); |
488 char* new_value = NEW_C_HEAP_ARRAY(char, strlen(value)+1); |
488 char* new_value = NEW_C_HEAP_ARRAY(char, strlen(value)+1, mtInternal); |
489 strcpy(new_value, value); |
489 strcpy(new_value, value); |
490 faddr->set_ccstr(new_value); |
490 faddr->set_ccstr(new_value); |
491 if (faddr->origin != DEFAULT && old_value != NULL) { |
491 if (faddr->origin != DEFAULT && old_value != NULL) { |
492 // Prior value is heap allocated so free it. |
492 // Prior value is heap allocated so free it. |
493 FREE_C_HEAP_ARRAY(char, old_value); |
493 FREE_C_HEAP_ARRAY(char, old_value, mtInternal); |
494 } |
494 } |
495 faddr->origin = origin; |
495 faddr->origin = origin; |
496 } |
496 } |
497 |
497 |
498 extern "C" { |
498 extern "C" { |
509 // Compute size |
509 // Compute size |
510 int length= 0; |
510 int length= 0; |
511 while (flagTable[length].name != NULL) length++; |
511 while (flagTable[length].name != NULL) length++; |
512 |
512 |
513 // Sort |
513 // Sort |
514 Flag** array = NEW_C_HEAP_ARRAY(Flag*, length); |
514 Flag** array = NEW_C_HEAP_ARRAY(Flag*, length, mtInternal); |
515 for (int index = 0; index < length; index++) { |
515 for (int index = 0; index < length; index++) { |
516 array[index] = &flagTable[index]; |
516 array[index] = &flagTable[index]; |
517 } |
517 } |
518 qsort(array, length, sizeof(Flag*), compare_flags); |
518 qsort(array, length, sizeof(Flag*), compare_flags); |
519 |
519 |
545 // Compute size |
545 // Compute size |
546 int length= 0; |
546 int length= 0; |
547 while (flagTable[length].name != NULL) length++; |
547 while (flagTable[length].name != NULL) length++; |
548 |
548 |
549 // Sort |
549 // Sort |
550 Flag** array = NEW_C_HEAP_ARRAY(Flag*, length); |
550 Flag** array = NEW_C_HEAP_ARRAY(Flag*, length, mtInternal); |
551 for (int index = 0; index < length; index++) { |
551 for (int index = 0; index < length; index++) { |
552 array[index] = &flagTable[index]; |
552 array[index] = &flagTable[index]; |
553 } |
553 } |
554 qsort(array, length, sizeof(Flag*), compare_flags); |
554 qsort(array, length, sizeof(Flag*), compare_flags); |
555 |
555 |
558 for (int i = 0; i < length; i++) { |
558 for (int i = 0; i < length; i++) { |
559 if (array[i]->is_unlocked()) { |
559 if (array[i]->is_unlocked()) { |
560 array[i]->print_on(out, withComments); |
560 array[i]->print_on(out, withComments); |
561 } |
561 } |
562 } |
562 } |
563 FREE_C_HEAP_ARRAY(Flag*, array); |
563 FREE_C_HEAP_ARRAY(Flag*, array, mtInternal); |
564 } |
564 } |