aboutsummaryrefslogtreecommitdiff
path: root/src/utils.c
blob: 16f75892452e65e0efc6f901e456f3b5cf5e3dc6 (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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include "../include/cfetch.h"
#include <string.h>

/* function: char *string_format(char* string)
 * input: pointer to a null-terminated string (must not be NULL)
 * return: pointer to a newly allocated string containing all space-separated words,
 * 	joined by single spaces; leading/trailing/multiple spaces are ignored.
 * on-error: returns NULL if memory allocation fails
 * misc: the returned pointer must be freed by the caller using free()
 * limits: processes at most 10 words, each up to 49 characters (last '\0')
 */
char *string_format(char* string) 
{
        // Wörterbuch array [Wort][Zeichenkette]
        char woerter[10][50] = { 0 };
        int wort_index = 0;
        int char_index = 0;

        while (*string != '\0') {
                // add '\0' stringterminator to end of word
                if (*string == ' ' && char_index > 0) {
                        // safty check for array length
                        if (wort_index > 9 || char_index > 49) {
                                break;
                        }

                        // next slot is char
                        // add '\0' to end string
                        woerter[wort_index][char_index] = '\0';
                        wort_index++;
                        char_index = 0;
                        string++;
                        continue;
                } 
                // skip extra spaces
                else if (*string == ' ' && char_index == 0) {
                        string++;
                        continue;
                }

                // safty check for array length
                if (char_index >= 49) {
                        break;
                }

                woerter[wort_index][char_index] = *string;
                char_index++;
                string++;
        }

        // terminate last word with '\0'
        if (char_index > 0 && wort_index < 10 && char_index < 49) {
                woerter[wort_index][char_index] = '\0';
                wort_index++;
        }

        /* 
         * return
         */
        char *ptr = NULL;

        // get length of woerter array
        if (wort_index == 0) {
                ptr = NULL;
        } else {
                int sum = 0;

                for (int i = 0; i < wort_index; i++) {
                        sum += strlen(woerter[i]);
                }
                sum += wort_index - 1; // for spaces
                sum += 1; // for Nulltermination


                ptr = (char *)malloc(sum);

                // check for NULL pointer
                if (ptr == NULL) {
                        return NULL;
                }

                //strcpy
                char *ende = ptr;

                for (int i = 0; i < wort_index; i++) {
                        ende = stpcpy(ende, woerter[i]);

                        if (i != wort_index - 1) {
                                *(ende++) = ' ';
                        }
                }
        }

        return ptr;
}

// input two char pointer
// output: one char pointer
// misc: caller needs to free the memory
char *concat(const char *s1, const char *s2) 
{
        const size_t len1 = strlen(s1);
        const size_t len2 = strlen(s2);
        char *result = malloc(len1 + len2 + 1); // +1 for '\0'

        if (result == NULL) {
                perror("allocating memory for strings failed");
                return NULL;
        }

        memcpy(result, s1, len1);
        memcpy(result + len1, s2, len2 + 1); // +1 for null-terminator
        return result; //caller needs to free memory
}


// input: pointer to string
// output: pointer to string with leading and tailing whitespaces removed
char *trim_whitespace(char* str) 
{
        char *end;

        // Trim leading spaces
        while (*str == ' ' || *str == '\t' || *str == '\n' || *str == '\r') {
                str++;
        }

        if (*str == '\0') return str; // all spaces

        // Trim trailing space
        end = str + strlen(str) - 1;

        while (end > str && (*end == ' ' || *end == '\t' || *end == '\r' || *end == '\n')) end--;

        // Write new null terminator character
        end[1] = '\0';

        return str;
}