a wrapper around strings

This commit is contained in:
Odweta
2024-02-04 18:51:42 +01:00
parent 53a282a3ea
commit 8832a2a4aa
9 changed files with 210 additions and 103 deletions
+8 -4
View File
@@ -1,6 +1,6 @@
CC := gcc
CFLAGS := -Wall -Werror
LIBS := -lvector -lfile -llist -lutil
LIBS := -lvector -lfile -llist -lutil -lstring
LIBSPATH := -L/usr/lib/odweta/
INCLUDEDIR := -I/usr/include/odweta/
PATCH := -Wl,-rpath=/usr/lib/odweta/
@@ -28,15 +28,19 @@ libutil.so: src/util.c
sudo $(CC) -c -fpic $< -o /usr/lib/odweta/util.o
sudo $(CC) -shared -o /usr/lib/odweta/$@ /usr/lib/odweta/util.o
libstring.so: src/string.c
sudo $(CC) -c -fpic $< -o /usr/lib/odweta/string.o
sudo $(CC) -shared -o /usr/lib/odweta/$@ /usr/lib/odweta/string.o
install:
sudo mkdir -p /usr/include/odweta/
sudo mkdir -p /usr/lib/odweta/
sudo cp src/vector.c src/file.c src/list.c src/util.c include/vector.h include/file.h include/list.h include/util.h /usr/include/odweta/
sudo make libvector.so libfile.so liblist.so libutil.so
sudo cp src/vector.c src/file.c src/list.c src/util.c src/string.c include/vector.h include/file.h include/list.h include/util.h include/string.h /usr/include/odweta/
sudo make libvector.so libfile.so liblist.so libutil.so libstring.so
sudo ldconfig # update ldconfig cache
clean:
sudo rm -f main /usr/lib/odweta/vector.o /usr/lib/odweta/file.o /usr/lib/odweta/list.o /usr/lib/odweta/util.o /usr/lib/odweta/libvector.so /usr/lib/odweta/libfile.so /usr/lib/odweta/liblist.so /usr/lib/odweta/libutil.so
sudo rm -f main /usr/lib/odweta/vector.o /usr/lib/odweta/file.o /usr/lib/odweta/list.o /usr/lib/odweta/util.o /usr/lib/odweta/string.o /usr/lib/odweta/libvector.so /usr/lib/odweta/libfile.so /usr/lib/odweta/liblist.so /usr/lib/odweta/libutil.so /usr/lib/odweta/libstring.so
cleanrepo:
rm -fr ./demo ./moved_copy_of_test.txt ./copy_of_test.txt
+13 -98
View File
@@ -1,106 +1,21 @@
// #include <stdio.h>
// #include <odweta/util.h>
//
// int main() {
// char* string = intToString(1729843);
//
// printf("final string: %s\n", string);
//
// char* sstring = intToString(123);
//
// printf("final string: %s\n", sstring);
//
// return 0;
// }
#include <odweta/file.h>
#include <stdio.h>
#include <odweta/string.h>
int main() {
printf("creating a file using 'fileInit(<filename>)' (returns a file_t*)\n");
file_t *f = fileInit("test.txt");
//printf("before init\n");
string_t *s = string_from("test string");
printf("printing the file contents\n\n");
filePrint(f);
//printf("before 1st println\n");
string_println(s);
printf("\nconvering the file contents into a string (char*)\n");
char *string = fileToString(f);
printf("\"\"\"\n%s\"\"\"\n", string);
//printf("before pushing chars\n");
string_push_chars(s, " appended");
printf("writing is quite simple, just call the 'fileWrite(file_t*, char*)' "
"or 'fileWriteln(file_t*, char*)' function, where the second argument "
"is the string you want to write into a file\nthe 'fileWriteln()' "
"function writes the specified string AND a '\\n' after it, whereas "
"the 'fileWrite()' function does not append the '\\n'\n");
fileWrite(f, "'this will not end with a \"\\n\"' ");
fileWriteln(f, "this line was appended");
filePrint(f);
//printf("before 2nd println\n");
string_println(s);
printf(
"if you are finished working with the file BEFORE the immediate end of "
"the program, run 'fileCleanup(file_t*)', otherwise it is not strictly "
"necessary\nit will, though, append a '\\n' at the end of the file if "
"you have not done so, making writing into files more consistent, so for "
"this reason, I recommend you use it with every file_t*\n");
fileCleanup(f);
//printf("before cleanup\n");
string_cleanup(s);
printf("copying and moving\nafter this block of code, the contents of "
"test.txt will have been copied into copy_of_test.txt and moved to "
"moved_copy_of_test.txt, which means that copy_of_test.txt is deleted "
"and the contents of test.txt are only in test.txt and "
"moved_copy_of_test.txt\n");
file_t *src = fileInit("test.txt");
fileCopy(src, "copy_of_test.txt");
printf("src:\n");
filePrint(src);
printf("\ndst:\n");
file_t *dst = fileInit("copy_of_test.txt");
filePrint(dst);
fileMove(dst, "moved_copy_of_test.txt");
printf("moved file:\n");
file_t *move_dst = fileInit("moved_copy_of_test.txt");
filePrint(move_dst);
fileCleanup(src);
printf("DO NOT cleanup a deleted file! (dst, in this case) it is already "
"done for you by the 'fileMove(file_t*, char*)' function\n");
// fileCleanup(dst);
fileCleanup(move_dst);
printf("when copying and moving files, the first argument is a file_t* "
"(source file) and the second argument is a char* (the path of the "
"destination file), not a file_t*!\n");
printf("prepending line numbers at the beggining of each line in a file\n");
file_t *g = fileInit("test.txt");
fileCopy(g, "copy_of_test.txt");
file_t *g_copy = fileInit("copy_of_test.txt");
fileNumberLines(g_copy);
printf("file withOUT prepended numbers:\n");
filePrint(g);
printf("file with prepended numbers:\n");
filePrint(g_copy);
fileCleanup(g);
// fileCleanup(g_copy);
printf("counting words in a file\n");
file_t *words = fileInit("test.txt");
int word_count = fileCountWords(words);
printf("word count of file %s is %d\n", words->path, word_count);
fileCleanup(words);
return 0;
//printf("before end\n");
return 0;
}
+21
View File
@@ -0,0 +1,21 @@
#include <odweta/string.h>
int main() {
//printf("before init\n");
string_t *s = string_from("test string");
//printf("before 1st println\n");
string_println(s);
//printf("before pushing chars\n");
string_push_chars(s, " appended");
//printf("before 2nd println\n");
string_println(s);
//printf("before cleanup\n");
string_cleanup(s);
//printf("before end\n");
return 0;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.
+5
View File
@@ -1,3 +1,6 @@
#ifndef LIST_H
#define LIST_H
/*
* What is this?
*
@@ -34,3 +37,5 @@ void listRemoveAt(list_t* l, int index);
void listSetAt(list_t* l, int index, dataType_e type, void* element);
void* listGetAt(list_t* l, int index);
#endif
+27
View File
@@ -0,0 +1,27 @@
#ifndef STRING_H
#define STRING_H
#include <odweta/util.h>
typedef struct {
char *content;
size_t length;
} string_t;
string_t *string_new(); // create a new empty string
string_t *string_from(char *chars); // create a new string from a given char_sequence
bool string_push_chars(string_t *this, char *chars); // append a char_sequence to a string
bool string_push(string_t *this, string_t *other); // append a string to a string
compare_e string_compare(string_t *left, string_t* right); // compare two strings
void string_print(string_t *this); // print a string
void string_println(string_t *this); // print a string with a \n
bool string_is_empty(string_t *this); // return true when s->content == ""
void string_cleanup(string_t *this); // memory cleanup
#endif
+13 -1
View File
@@ -1,6 +1,17 @@
#ifndef UTIL_H
#define UTIL_H
#include <stdbool.h>
typedef enum {
LESS,
LESS_EQUAL,
EQUAL,
NOT_EQUAL,
GREATER,
GREATER_EQUAL
} compare_e;
typedef long unsigned int size_t;
typedef enum {
@@ -8,7 +19,8 @@ typedef enum {
FLOAT = 1,
CHAR = 2,
VECTOR = 3, // allows for multi-dimensional arrays
LIST = 4
LIST = 4,
BOOL = 5
} dataType_e;
char* intToString(int x); // convert an int into a string
+123
View File
@@ -0,0 +1,123 @@
#include <odweta/string.h>
#include <odweta/util.h>
#include <stdlib.h>
#include <stdio.h>
size_t chars_length(char *chars) {
int i = 0;
while (*(chars + (i++)) != '\0');
return i;
}
string_t *string_new() {
string_t *s = (string_t *)malloc(sizeof(string_t));
s->content = (char *)malloc(sizeof(char));
if (s->content == NULL) {
return NULL;
}
s->content = &(char){'\0'};
s->length = 0;
return s;
}
string_t *string_from(char *chars) {
string_t *s = (string_t *)malloc(sizeof(string_t));
s->content = (char *)malloc(sizeof(chars));
if (s->content == NULL) {
return NULL;
}
int i = 0;
while (*(chars + i) != '\0') {
char *tmp = realloc(s->content, sizeof(s->content) + sizeof(char));
if (tmp == NULL) {
return NULL;
}
s->content = tmp;
*(s->content + i) = *(chars + i);
i++;
}
char *tmp = realloc(s->content, sizeof(s->content) + sizeof(char));
if (tmp == NULL) {
return NULL;
}
s->content = tmp;
*(s->content + (++i)) = '\0';
s->length = (int)chars_length(s->content)-1; // -1 because \0
return s;
}
bool string_push_chars(string_t *this, char *chars) {
int i = this->length;
int j = 0;
while (*(chars + j) != '\0') {
char *tmp = realloc(this->content, sizeof(this->content) + sizeof(char));
if (tmp == NULL) {
return false;
}
this->content = tmp;
*(this->content + i) = *(chars + j);
i++;
j++;
}
this->length = (int)chars_length(this->content)-1;
return true;
}
bool string_push(string_t *this, string_t* to_be_pushed) {
return string_push_chars(this, to_be_pushed->content);
}
compare_e string_compare(string_t* left, string_t *right) {
int i = 0;
while (
*((left->content) + i) != '\0' ||
*((right->content) + i) != '\0'
) {
if (*((left->content) + i) == *((right->content) + i)) {
i++;
continue;
} else {
return NOT_EQUAL;
}
}
return EQUAL;
}
void string_print(string_t *this) {
printf("%s", this->content);
}
void string_println(string_t *this) {
printf("%s\n", this->content);
}
bool string_is_empty(string_t *this) {
compare_e cmp = string_compare(this, string_from(""));
switch (cmp) {
case EQUAL:
return true;
case NOT_EQUAL:
return false;
default:
return false;
}
}
void string_cleanup(string_t *this) {
free(this->content);
free(this);
}