aboutsummaryrefslogtreecommitdiff
path: root/src/utils.c
blob: 56cca93f98e0a9c75f6625a7f6133b0b4e02d2f8 (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
#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
}


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;
}