Skip to content

Commit

Permalink
lkstr
Browse files Browse the repository at this point in the history
  • Loading branch information
robdelacruz committed Mar 21, 2023
1 parent 8a5678b commit d939684
Show file tree
Hide file tree
Showing 5 changed files with 144 additions and 14 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
t
tserv
tclient
lktest

19 changes: 11 additions & 8 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
CFLAGS=-g -Wall
LIBS=

all: tserv tclient t
all: tserv tclient t lktest

tserv: tserv.c netfuncs.c
gcc -o tserv tserv.c netfuncs.c $(CFLAGS) $(LIBS)
tserv: tserv.c netfuncs.c lklib.c
gcc -o tserv tserv.c netfuncs.c lklib.c $(CFLAGS) $(LIBS)

tclient: tclient.c netfuncs.c
gcc -o tclient tclient.c netfuncs.c $(CFLAGS) $(LIBS)
tclient: tclient.c netfuncs.c lklib.c
gcc -o tclient tclient.c netfuncs.c lklib.c $(CFLAGS) $(LIBS)

t: t.c netfuncs.c
gcc -o t t.c netfuncs.c $(CFLAGS) $(LIBS)
t: t.c netfuncs.c lklib.c
gcc -o t t.c netfuncs.c lklib.c $(CFLAGS) $(LIBS)

lktest: lktest.c lklib.c
gcc -o lktest lktest.c lklib.c $(CFLAGS) $(LIBS)

clean:
rm -rf t tserv tclient
rm -rf t tserv tclient lktest

71 changes: 68 additions & 3 deletions lklib.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,80 @@
#include <assert.h>
#include "lklib.h"

void zero_s(lkstr_s *lks) {
memset(lks->s, '\0', lks->s_size+1);
}

lkstr_s *lkstr_new(char *s) {
lkstr_s *lks = malloc(sizeof(lkstr_s));

size_t s_len = strlen(s);
lks->s_len = s_len;
lks->s_size = s_len;
lks->s = malloc(lks->s_size+1);
zero_s(lks);
strncpy(lks->s, s, s_len);

return lks;
}
lkstr_s *lkstr_size_new(size_t size) {
lkstr_s *lks = malloc(sizeof(lkstr_s));

lks->s_len = 0;
lks->s_size = size;
lks->s = malloc(lks->s_size+1);
zero_s(lks);

return lks;
}
void lkstr_free(lkstr_s *lks) {
assert(lks->s != NULL);

zero_s(lks);
free(lks->s);
lks->s = NULL;
free(lks);
}
void lkstr_free(lkstr_s *lkstr) {

void lkstr_assign(lkstr_s *lks, char *s) {
size_t s_len = strlen(s);
if (s_len > lks->s_size) {
lks->s_size = s_len;
lks->s = realloc(lks->s, lks->s_size+1);
}
zero_s(lks);
strncpy(lks->s, s, s_len);
lks->s_len = s_len;
}

void lkstr_sprintf(lkstr_s *lkstr, char *fmt, ...) {
void lkstr_sprintf(lkstr_s *lks, char *fmt, ...) {
va_list args;
char *ps;
va_start(args, fmt);
int z = vasprintf(&ps, fmt, args);
if (z == -1) return;
va_end(args);

lkstr_assign(lks, ps);
free(ps);
}
void lkstr_append(lkstr_s *lkstr, char *s) {

void lkstr_append(lkstr_s *lks, char *s) {
size_t s_len = strlen(s);
if (lks->s_len + s_len > lks->s_size) {
lks->s_size = lks->s_len + s_len;
lks->s = realloc(lks->s, lks->s_size+1);
}

memset(lks->s + lks->s_len, '\0', s_len+1);
strncpy(lks->s + lks->s_len, s, s_len);
lks->s_len = lks->s_len + s_len;
}

int lkstr_equal(lkstr_s *lks1, lkstr_s *lks2) {
if (strcmp(lks1->s, lks2->s) == 0) {
return 1;
}
return 0;
}

8 changes: 5 additions & 3 deletions lklib.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,19 @@
#define LKLIB_H

typedef struct {
char *str;
size_t str_len;
size_t str_size;
char *s;
size_t s_len;
size_t s_size;
} lkstr_s;

lkstr_s *lkstr_new(char *s);
lkstr_s *lkstr_size_new(size_t size);
void lkstr_free(lkstr_s *lkstr);

void lkstr_assign(lkstr_s *lks, char *s);
void lkstr_sprintf(lkstr_s *lkstr, char *fmt, ...);
void lkstr_append(lkstr_s *lkstr, char *s);
int lkstr_equal(lkstr_s *lks1, lkstr_s *lks2);

#endif

59 changes: 59 additions & 0 deletions lktest.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <assert.h>
#include "lklib.h"

int main(int argc, char *argv[]) {
lkstr_s *lks, *lks2;

printf("Running lkstr_s tests... ");
lks = lkstr_new("");
assert(lks->s_len == 0);
assert(lks->s_size >= lks->s_len);
assert(strcmp(lks->s, "") == 0);
lkstr_free(lks);

lks = lkstr_size_new(10);
assert(lks->s_len == 0);
assert(lks->s_size == 10);
assert(strcmp(lks->s, "") == 0);
lkstr_free(lks);

// lks, lks2
lks = lkstr_new("abc def");
lks2 = lkstr_new("abc ");
assert(lks->s_len == 7);
assert(lks->s_size >= lks->s_len);
assert(!lkstr_equal(lks, lks2));
assert(strcmp(lks->s, "abc "));
assert(strcmp(lks->s, "abc def2"));
assert(!strcmp(lks->s, "abc def"));

lkstr_append(lks2, "def");
assert(!strcmp(lks->s, lks2->s));
assert(lkstr_equal(lks, lks2));

lkstr_assign(lks2, "abc def");
assert(lkstr_equal(lks, lks2));

lkstr_assign(lks2, "");
assert(!lkstr_equal(lks, lks2));

lkstr_sprintf(lks2, "abc %s", "def");
assert(!strcmp(lks->s, lks2->s));
assert(lkstr_equal(lks, lks2));

lkstr_sprintf(lks, "abc%ddef%d", 123, 456);
lkstr_sprintf(lks2, "%s123%s456", "abc", "def");
assert(!strcmp(lks->s, lks2->s));
assert(lkstr_equal(lks, lks2));
lkstr_free(lks);
lkstr_free(lks2);
printf("Done.\n");

return 0;
}

0 comments on commit d939684

Please sign in to comment.