Ticket #7968: CDDA_uppercase_string_1.diff

File CDDA_uppercase_string_1.diff, 3.5 KB (added by jscipione, 13 years ago)

This is a patch that redoes the CDDA file system str_uppercase to look out for words that don't get uppercased. Since the bug seems to get triggered on the 'O' in 'Of' this code is a bit safer, no idea if it will fix this issue though...

  • src/add-ons/kernel/file_systems/cdda/cdda.cpp

    diff --git src/add-ons/kernel/file_systems/cdda/cdda.cpp src/add-ons/kernel/file_systems/cdda/cdda.cpp
    index 77320a9..f0f046a 100644
    capitalize_string(char *string)  
    237237    if (string == NULL)
    238238        return;
    239239
    240     bool newWord = isalpha(string[0]) || isspace(string[0]);
    241     while (string[0]) {
    242         if (isalpha(string[0])) {
    243             if (newWord) {
    244                 string[0] = toupper(string[0]);
    245                 newWord = false;
    246             } else
    247                 string[0] = tolower(string[0]);
    248         } else if (string[0] != '\'')
    249             newWord = true;
     240    int i;
     241    char* begin = string;
     242    char* running = strtok(string, " ");
     243
     244    while (running != NULL) {
     245        if (strcasecmp(running, "a") == 0           // articles
     246            || strcasecmp(running, "an") == 0
     247            || strcasecmp(running, "the") == 0
     248            || strcasecmp(running, "also") == 0     // conjunctions < 5 letters
     249            || strcasecmp(running, "and") == 0
     250            || strcasecmp(running, "both") == 0
     251            || strcasecmp(running, "but") == 0
     252            || strcasecmp(running, "even") == 0
     253            || strcasecmp(running, "if") == 0
     254            || strcasecmp(running, "nor") == 0
     255            || strcasecmp(running, "only") == 0
     256            || strcasecmp(running, "or") == 0
     257            || strcasecmp(running, "so") == 0
     258            || strcasecmp(running, "yet") == 0
     259            || strcasecmp(running, "amid") == 0     // prepositions < 5 letters
     260            || strcasecmp(running, "as") == 0
     261            || strcasecmp(running, "at") == 0
     262            || strcasecmp(running, "atop") == 0
     263            || strcasecmp(running, "by") == 0
     264            || strcasecmp(running, "down") == 0
     265            || strcasecmp(running, "for") == 0
     266            || strcasecmp(running, "from") == 0
     267            || strcasecmp(running, "in") == 0
     268            || strcasecmp(running, "into") == 0
     269            || strcasecmp(running, "like") == 0
     270            || strcasecmp(running, "near") == 0
     271            || strcasecmp(running, "next") == 0
     272            || strcasecmp(running, "not") == 0
     273            || strcasecmp(running, "of") == 0
     274            || strcasecmp(running, "off") == 0
     275            || strcasecmp(running, "on") == 0
     276            || strcasecmp(running, "onto") == 0
     277            || strcasecmp(running, "over") == 0
     278            || strcasecmp(running, "past") == 0
     279            || strcasecmp(running, "per") == 0
     280            || strcasecmp(running, "plus") == 0
     281            || strcasecmp(running, "sans") == 0
     282            || strcasecmp(running, "save") == 0
     283            || strcasecmp(running, "than") == 0
     284            || strcasecmp(running, "till") == 0
     285            || strcasecmp(running, "to") == 0
     286            || strcasecmp(running, "up") == 0
     287            || strcasecmp(running, "upon") == 0
     288            || strcasecmp(running, "on") == 0
     289            || strcasecmp(running, "onto") == 0
     290            || strcasecmp(running, "unto") == 0
     291            || strcasecmp(running, "via") == 0
     292            || strcasecmp(running, "vs") == 0
     293            || strcasecmp(running, "vs.") == 0
     294            || strcasecmp(running, "ye") == 0
     295            || strcasecmp(running, "with") == 0) {
     296            for (i = 0; running[i] != '\0'; i++) {
     297                if (isalpha(running[i]))
     298                    running[i] = tolower(running[i]);
     299            }
     300        } else if (isalpha(running[0]))
     301            running[0] = toupper(running[0]);
     302
     303        memmove(string, running, strlen(running));
     304        string += strlen(running);
     305        running = strtok(NULL, " ");
     306        if (running != NULL) {
     307            memmove(string, " ", 1);
     308            string++;
     309        }
     310    }
    250311
    251         string++;
     312    *string = '\0'; // end the string
     313    string = begin;
     314
     315    // uppercase the first letter
     316    if (isalpha(string[0]))
     317        string[0] = toupper(string[0]);
     318
     319    if (strlen(string) > 1) {
     320        // uppercase the first letter of the last word
     321        for (i = strlen(string) - 1; i > 0 && !isspace(string[i]); i--) {
     322            if (isspace(string[i - 1]) && isalpha(string[i]))
     323                string[i] = toupper(string[i]);
     324        }
    252325    }
    253326}
    254327