use custom header file to remove duplication

This commit is contained in:
Night Kaly 2023-12-04 23:04:04 +00:00
parent 7b6cb31d18
commit 08dd50e5d2
6 changed files with 31 additions and 222 deletions

View file

@ -1,3 +1,5 @@
#include "../../util.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@ -7,28 +9,6 @@ typedef struct {
char* value;
} number;
void replace(char *target, const char *needle, const char *replacement)
{
char buffer[1024] = { 0 };
char *insert_point = &buffer[0];
const char *tmp = target;
size_t needle_len = strlen(needle);
size_t repl_len = strlen(replacement);
while (1) {
const char *p = strstr(tmp, needle);
if (p == NULL) { // walked past last occurrence of needle; copy remaining part
strcpy(insert_point, tmp);
break;
}
memcpy(insert_point, tmp, p - tmp); // copy part before needle
insert_point += p - tmp;
memcpy(insert_point, replacement, repl_len); // copy replacement string
insert_point += repl_len;
tmp = p + needle_len;
}
strcpy(target, buffer);
}
int main() {
FILE *inputfile = fopen("./input", "r");
char *line = malloc(sizeof(char) * 100);

View file

@ -1,3 +1,5 @@
#include "../../util.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@ -10,72 +12,6 @@ typedef struct {
int colors[3];
} game;
char** str_split(char* a_str, const char a_delim)
{
char** result = 0;
size_t count = 0;
char* tmp = a_str;
char* last_comma = 0;
char delim[2];
delim[0] = a_delim;
delim[1] = 0;
/* Count how many elements will be extracted. */
while (*tmp)
{
if (a_delim == *tmp)
{
count++;
last_comma = tmp;
}
tmp++;
}
/* Add space for trailing token. */
count += last_comma < (a_str + strlen(a_str) - 1);
/* Add space for terminating null string so caller
knows where the list of returned strings ends. */
count++;
result = malloc(sizeof(char*) * count);
if (result)
{
size_t idx = 0;
char* token = strtok(a_str, delim);
while (token)
{
assert(idx < count);
*(result + idx++) = strdup(token);
token = strtok(0, delim);
}
assert(idx == count - 1);
*(result + idx) = 0;
}
return result;
}
// Note: This function returns a pointer to a substring of the original string.
// If the given string was allocated dynamically, the caller must not overwrite
// that pointer with the returned value, since the original pointer must be
// deallocated using the same allocator with which it was allocated. The return
// value must NOT be deallocated using free() etc.
char *trimwhitespace(char *str)
{
char *end;
// Trim leading space
while(isspace((unsigned char)*str)) str++;
if(*str == 0) // All spaces?
return str;
// Trim trailing space
end = str + strlen(str) - 1;
while(end > str && isspace((unsigned char)*end)) end--;
// Write new null terminator character
end[1] = '\0';
return str;
}
int main() {
FILE *inputfile = fopen("./input", "r");
char line[1024] = { 0 };

View file

@ -1,3 +1,5 @@
#include "../../util.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@ -9,72 +11,6 @@ typedef struct {
int colors[3];
} game;
char** str_split(char* a_str, const char a_delim)
{
char** result = 0;
size_t count = 0;
char* tmp = a_str;
char* last_comma = 0;
char delim[2];
delim[0] = a_delim;
delim[1] = 0;
/* Count how many elements will be extracted. */
while (*tmp)
{
if (a_delim == *tmp)
{
count++;
last_comma = tmp;
}
tmp++;
}
/* Add space for trailing token. */
count += last_comma < (a_str + strlen(a_str) - 1);
/* Add space for terminating null string so caller
knows where the list of returned strings ends. */
count++;
result = malloc(sizeof(char*) * count);
if (result)
{
size_t idx = 0;
char* token = strtok(a_str, delim);
while (token)
{
assert(idx < count);
*(result + idx++) = strdup(token);
token = strtok(0, delim);
}
assert(idx == count - 1);
*(result + idx) = 0;
}
return result;
}
// Note: This function returns a pointer to a substring of the original string.
// If the given string was allocated dynamically, the caller must not overwrite
// that pointer with the returned value, since the original pointer must be
// deallocated using the same allocator with which it was allocated. The return
// value must NOT be deallocated using free() etc.
char *trimwhitespace(char *str)
{
char *end;
// Trim leading space
while(isspace((unsigned char)*str)) str++;
if(*str == 0) // All spaces?
return str;
// Trim trailing space
end = str + strlen(str) - 1;
while(end > str && isspace((unsigned char)*end)) end--;
// Write new null terminator character
end[1] = '\0';
return str;
}
int main() {
FILE *inputfile = fopen("./input", "r");
char line[1024] = { 0 };

View file

@ -1,3 +1,5 @@
#include "../../util.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@ -5,72 +7,6 @@
#include <stdbool.h>
#include <assert.h>
char** str_split(char* a_str, const char a_delim)
{
char** result = 0;
size_t count = 0;
char* tmp = a_str;
char* last_comma = 0;
char delim[2];
delim[0] = a_delim;
delim[1] = 0;
/* Count how many elements will be extracted. */
while (*tmp)
{
if (a_delim == *tmp)
{
count++;
last_comma = tmp;
}
tmp++;
}
/* Add space for trailing token. */
count += last_comma < (a_str + strlen(a_str) - 1);
/* Add space for terminating null string so caller
knows where the list of returned strings ends. */
count++;
result = malloc(sizeof(char*) * count);
if (result)
{
size_t idx = 0;
char* token = strtok(a_str, delim);
while (token)
{
assert(idx < count);
*(result + idx++) = strdup(token);
token = strtok(0, delim);
}
assert(idx == count - 1);
*(result + idx) = 0;
}
return result;
}
// Note: This function returns a pointer to a substring of the original string.
// If the given string was allocated dynamically, the caller must not overwrite
// that pointer with the returned value, since the original pointer must be
// deallocated using the same allocator with which it was allocated. The return
// value must NOT be deallocated using free() etc.
char *trimwhitespace(char *str)
{
char *end;
// Trim leading space
while(isspace((unsigned char)*str)) str++;
if(*str == 0) // All spaces?
return str;
// Trim trailing space
end = str + strlen(str) - 1;
while(end > str && isspace((unsigned char)*end)) end--;
// Write new null terminator character
end[1] = '\0';
return str;
}
int main() {
FILE *inputfile = fopen("./input", "r");
char line[2048] = { 0 };

View file

@ -64,3 +64,25 @@ char *trimwhitespace(char *str)
end[1] = '\0';
return str;
}
void replace(char *target, const char *needle, const char *replacement)
{
char buffer[1024] = { 0 };
char *insert_point = &buffer[0];
const char *tmp = target;
size_t needle_len = strlen(needle);
size_t repl_len = strlen(replacement);
while (1) {
const char *p = strstr(tmp, needle);
if (p == NULL) { // walked past last occurrence of needle; copy remaining part
strcpy(insert_point, tmp);
break;
}
memcpy(insert_point, tmp, p - tmp); // copy part before needle
insert_point += p - tmp;
memcpy(insert_point, replacement, repl_len); // copy replacement string
insert_point += repl_len;
tmp = p + needle_len;
}
strcpy(target, buffer);
}

View file

@ -1,4 +1,3 @@
char** str_split(char* a_str, const char a_delim);
char* trimwhitespace(char *str);
void replace(char *target, const char *needle, const char *replacement);