summary refs log tree commit diff stats
path: root/c/acronym/src/acronym.c
blob: 9d86a6d5259c4492cc29507b92ec3d891ac42fd9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "acronym.h"
#include <ctype.h>
#include <stdlib.h>

char *abbreviate(const char *phrase) {
    if (phrase == NULL) return NULL;
    if (phrase[0] == '\0') return NULL;

    size_t pos = 0;
    char *acronym = malloc(1 * sizeof(char));

    if (isalpha(phrase[0]))
        acronym[pos++] = toupper((unsigned char) phrase[0]);

    for (size_t idx = 0; phrase[idx] != '\0'; idx++)
        if ((phrase[idx] == ' ' || phrase[idx] == '-' || phrase[idx] == '_')
            && isalpha(phrase[idx + 1])) {
            acronym = realloc(acronym, (pos + 1) * sizeof(char));
            acronym[pos++] = toupper((unsigned char) phrase[idx + 1]);
        }

    acronym = realloc(acronym, (pos + 1) * sizeof(char));
    acronym[pos] = '\0';

    return acronym;
}