IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 10446


Ignore:
Timestamp:
Dec 4, 2006, 12:15:04 PM (19 years ago)
Author:
Paul Price
Message:

Changing API for psStringSubstitute to something less prone to user mistake

Location:
trunk/psLib
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/sys/psString.c

    r10286 r10446  
    1313 *  @author David Robbins, MHPCC
    1414 *
    15  *  @version $Revision: 1.46 $ $Name: not supported by cvs2svn $
    16  *  @date $Date: 2006-11-29 21:33:09 $
     15 *  @version $Revision: 1.47 $ $Name: not supported by cvs2svn $
     16 *  @date $Date: 2006-12-04 22:15:04 $
    1717 *
    1818 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    275275// given the input string, search for all copies of the key, and replace with the replacement value
    276276// the input string may be freed if not needed
    277 psString psStringSubstitute(psString input,
    278                             const char *replace,
    279                             const char *key)
    280 {
     277ssize_t psStringSubstitute(psString *input,
     278                           const char *replace,
     279                           const char *key)
     280{
     281    PS_ASSERT_PTR_NON_NULL(input, 0);
     282
    281283    // Empty input gives empty output
    282     if (!input || strlen(input) == 0) {
    283         return input;
     284    if (!*input || strlen(*input) == 0) {
     285        return 0;
    284286    }
    285287    // No key gives the same as the input
    286288    if (!key || strlen(key) == 0) {
    287         return input;
    288     }
    289     if (!psMemCheckString(input)) {
     289        return strlen(*input);
     290    }
     291    if (!psMemCheckString(*input)) {
    290292        psError(PS_ERR_BAD_PARAMETER_TYPE, true, "This function requires a psString as input.\n");
    291         return NULL;
     293        return 0;
    292294    }
    293295
     
    302304    }
    303305
    304     char *search = input;               // Search this string
     306    char *search = *input;              // Search this string
    305307    while (true) {
    306308        char *found = strstr(search, key); // Found occurence of the key
    307309        if (!found) {
    308             return input;
     310            return strlen(*input);
    309311        }
    310312
     
    313315
    314316        // this is safe since we will subtract strlen(key) elements from input
    315         psString output = psStringAlloc(strlen(input) + replaceLength + 1); // Output string
    316         int numChar = found - input;    // Number of characters to copy
     317        psString output = psStringAlloc(strlen(*input) + replaceLength + 1); // Output string
     318        int numChar = found - *input;    // Number of characters to copy
    317319
    318320        // copy the first segement into 'output'
    319         strncpy(output, input, numChar);
     321        strncpy(output, *input, numChar);
    320322
    321323        // copy the key replacement to the start of the key
     
    328330        strcpy(output + numChar, found + strlen(key));
    329331
    330         psFree(input);
    331         input = output;
     332        psFree(*input);
     333        *input = output;
    332334        search = output + numChar;
    333335    }
    334336
    335337    psAbort(__func__, "Should never get here.\n");
    336     return NULL;
     338    return 0;
    337339}
    338340
  • trunk/psLib/src/sys/psString.h

    r10286 r10446  
    1414 *  @author David Robbins, MHPCC
    1515 *
    16  *  @version $Revision: 1.32 $ $Name: not supported by cvs2svn $
    17  *  @date $Date: 2006-11-29 21:33:09 $
     16 *  @version $Revision: 1.33 $ $Name: not supported by cvs2svn $
     17 *  @date $Date: 2006-12-04 22:15:04 $
    1818 *
    1919 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    191191 *  the replacement value wherever found.  The input string may be freed if not needed.
    192192 *
    193  *  @return char*:      the modified input string.
    194  */
    195 psString psStringSubstitute (
    196     psString input,                     ///< input string to be modified
     193 *  @return ssize_t:      the length of the new string (excluding '\0')
     194 */
     195ssize_t psStringSubstitute (
     196    psString *input,                    ///< ptr to input string to be modified
    197197    const char *replace,                ///< replacement value
    198198    const char *key                     ///< string to be replaced in input
  • trunk/psLib/test/sys/tap_psStringSubstitute.c

    r8841 r10446  
    1818    {
    1919        psString input = psStringCopy(ORIGINAL);
    20         input = psStringSubstitute(input, ",", NULL);
     20        psStringSubstitute(&input, ",", NULL);
    2121        ok(input && strcmp(input, ORIGINAL) == 0, "output = %s", input);
    2222        psFree(input);
     
    2828    {
    2929        psString input = psStringCopy(ORIGINAL);
    30         input = psStringSubstitute(input, "XXX", "");
     30        psStringSubstitute(&input, "XXX", "");
    3131        ok(input && strcmp(input, ORIGINAL) == 0, "output = %s", input);
    3232        psFree(input);
     
    3838    {
    3939        psString input = psStringCopy(ORIGINAL);
    40         psString output = psStringSubstitute(input, NULL, ",");
    41         ok(output && strcmp(output, CORRECTED) == 0, "output = %s", output);
    42         psFree(output);
     40        psStringSubstitute(&input, NULL, ",");
     41        ok(input && strcmp(input, CORRECTED) == 0, "output = %s", input);
     42        psFree(input);
    4343        mem();
    4444    }
     
    4747    {
    4848        psString input = psStringCopy(ORIGINAL);
    49         psString output = psStringSubstitute(input, "", ",");
    50         ok(output && strcmp(output, CORRECTED) == 0, "output = %s", output);
    51         psFree(output);
     49        psStringSubstitute(&input, "", ",");
     50        ok(input && strcmp(input, CORRECTED) == 0, "output = %s", input);
     51        psFree(input);
    5252        mem();
    5353    }
     
    5555    // Return NULL for NULL input
    5656    {
    57         psString output = psStringSubstitute(NULL, "XXX", ",");
    58         ok(!output, "output = %s", output);
     57        int status = psStringSubstitute(NULL, "XXX", ",");
     58        ok(status == 0, "status = %d", status);
    5959        mem();
    6060    }
     
    6363    {
    6464        psString input = psStringCopy("");
    65         psString output = psStringSubstitute(input, "XXX", ",");
    66         ok(output && strcmp(output, input) == 0, "output = %s", output);
    67         psFree(output);
     65        psStringSubstitute(&input, "XXX", ",");
     66        ok(input && strcmp(input, "") == 0, "output = %s", input);
     67        psFree(input);
    6868        mem();
    6969    }
     
    7272    {
    7373        psString input = psStringCopy(ORIGINAL);
    74         psString output = psStringSubstitute(input, "!", ",");
    75         ok(output && strcmp(output, "This is! a! test case! to check.") == 0, "output = %s", output);
    76         psFree(output);
     74        psStringSubstitute(&input, "!", ",");
     75        ok(input && strcmp(input, "This is! a! test case! to check.") == 0, "output = %s", input);
     76        psFree(input);
    7777        mem();
    7878    }
     
    8181    {
    8282        psString input = psStringCopy(ORIGINAL);
    83         psString output = psStringSubstitute(input, "; This string is too long to fit in input(35 chars)", ".");
    84         ok(output && strcmp(output, "This is, a, test case, to check; "
    85                             "This string is too long to fit in input(35 chars)") == 0,
    86            "output = %s", output);
    87         psFree(output);
     83        psStringSubstitute(&input, "; This string is too long to fit in input(35 chars)", ".");
     84        ok(input && strcmp(input, "This is, a, test case, to check; "
     85                           "This string is too long to fit in input(35 chars)") == 0,
     86           "output = %s", input);
     87        psFree(input);
    8888        mem();
    8989    }
Note: See TracChangeset for help on using the changeset viewer.