summaryrefslogtreecommitdiff
path: root/str/str.h
blob: 84f1901e1c2244539414e2307e08daefc7b492ad (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
#ifndef STR_H
#define STR_H

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <string.h>
#include <stdarg.h>
#include <ctype.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "types/types.h"
#include "files/files.h"

#define XSTR(S)	STR(S)
#define STR(S)	#S


typedef struct str {
	u32 cap;
	u32 len;
	char *ptr;
} str;


bool charisalpha(char c);
bool charisnum(char c);
bool charisblank(char c);
bool charislinebreak(char c);
bool charisspace(char c);

char lowerchar(char c);
u32 lowers(char *s);

u32 len(const char *s);

// reorder?
str dstr(char *s);
str dnstr(u32 cap);
str dsstr(char *s);
str dsnstr(char *s, u32 len);

#define slen(s) (sizeof(s)-1)

#define sstr(s) ((str){.cap = 0, .len = slen(s), .ptr = s})

#define snstr(s, n) ((str){.cap = 0, .len = n, .ptr = s})

int resize_str(str *s, u32 nsize);

str dup_str(str s);

u32 lowerstr(str s);

str utostr(u64 n, int b);

u64 strtou(str s);

int streq(str s1, str s2);
int streqn(str s1, str s2, u32 n);

#define NUMSTRS(...) (sizeof((str[]){{0}, ##__VA_ARGS__})/sizeof(str)-1)

// look into calling vlen_nstrs from len_nstrs
u64 len_nstrs(u64 n, ...);

u64 vlen_nstrs(u64 n, va_list args);

#define len_strs(...) \
	len_nstrs(NUMSTRS(__VA_ARGS__), __VA_ARGS__)

// probably should change to append or something
#define copy_str(dest, src) \
	if(dest.ptr != NULL && src.ptr != NULL){	\
		memcpy((dest).ptr+(dest).len, (src).ptr, (src).len); \
		(dest).len += (src).len;	\
	}

#define move_str(dest, src) \
	if(dest.ptr != NULL && src.ptr != NULL){	\
		memmove((dest).ptr+(dest).len, (src).ptr, (src).len); \
		(dest).len += (src).len;	\
	}

void copy_nstrs(str dst, u64 n, ...);
void vcopy_nstrs(str dst, u64 n, va_list args);
void move_nstrs(str dst, u64 n, ...);
void vmove_nstrs(str dst, u64 n, va_list args);
str dup_nstrs(u64 n, ...);
str vdup_nstrs(u64 n, va_list args);
#define copy_strs(d, ...) \
	copy_nstrs(d, NUMSTRS(__VA_ARGS__), __VA_ARGS__); \
	(d).len += len_nstrs(NUMSTRS(__VA_ARGS__), __VA_ARGS__)
#define move_strs(d, ...) \
	move_nstrs(d, NUMSTRS(__VA_ARGS__), __VA_ARGS__); \
	(d).len += len_nstrs(NUMSTRS(__VA_ARGS__), __VA_ARGS__)
#define dup_strs(...) \
	dup_nstrs(NUMSTRS(__VA_ARGS__), __VA_ARGS__);

str read_delim(char *buf, char d);
str bread_delim(char *buf, char d);
str sread_delim(char *buf, char d);
str sbread_delim(char *buf, char d);
str read_delim_f(char *buf, bool (*func)(char), bool func_cond);
str bread_delim_f(char *buf, bool (*func)(char), bool func_cond);
str sread_delim_f(char *buf, bool (*func)(char), bool func_cond);
str sbread_delim_f(char *buf, bool (*func)(char), bool func_cond);

// probably do away with this
u32 get_line_len(char *buf);

str fd_to_str(int fd);
str fd_to_nstr(int fd, u32 len);
str fp_to_str(FILE *fp);
str fp_to_nstr(FILE *fp, u32 len);
str file_to_str(char *filename);
str file_to_nstr(char *filename, u32 len);
#define str_to_fd(s, fd) write(fd, s.ptr, s.len)
#define str_to_fp(s, fp) fwrite(s.ptr, sizeof(s.ptr[0]), s.len, fp)
void str_to_file(str s, char *filename);

str map_file(char *filename);
// TODO: consider adding 'at' to other file-to-str functions
str map_file_at(char *filename, int len, int at);
void unmap_file(str *s);

#define read_str(max) fread_str(STDIN_FILENO, max)
str fread_str(int fd, int max);
void print_str(str s);

void free_str(str *s);

char *charinstr(char c, str s); // move somewhere relevant

#endif