-
Notifications
You must be signed in to change notification settings - Fork 5
/
utils.c
96 lines (83 loc) · 1.86 KB
/
utils.c
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
/*
* A variety of utility functions.
*
* See utils.h for more info
*
* This is free and unencumbered software released into the public domain.
* http://unlicense.org/
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
/* Case insensitive strcmp()
*/
int my_stricmp(const char *p, const char *q) {
for(;*p && tolower(*p) == tolower(*q); p++, q++);
return tolower(*p) - tolower(*q);
}
/* strdup() is not ANSI C */
char *my_strdup(const char *s) {
char *a;
size_t len = strlen(s);
a = malloc(len + 1);
if(!a) return NULL;
memcpy(a, s, len + 1);
return a;
}
/* converts a string to lowercase */
char *my_strlower (char *p) {
char *s;
for (s = p; s[0]; s++)
s[0] = tolower (s[0]);
return p;
}
/* converts a string to lowercase */
char *my_strupper (char *p)
{
char *s;
for (s = p; s[0]; s++)
s[0] = toupper (s[0]);
return p;
}
char *my_strtok_r(char *str, const char *delim, char **saveptr) {
char *s;
if(!str)
str = *saveptr;
if(!str[0]) {
*saveptr = str;
return NULL;
}
s = strpbrk(str, delim);
if(s) {
s[0] = '\0';
*saveptr = s + 1;
while((*saveptr)[0] && strchr(delim, (*saveptr)[0]))
(*saveptr)++;
} else
for(*saveptr = str; (*saveptr)[0]; (*saveptr)++);
return str;
}
/* Reads an entire file into a dynamically allocated memory buffer.
* The returned buffer needs to be free()d afterwards
*/
char *my_readfile(const char *fname) {
FILE *f;
long len,r;
char *str;
if(!(f = fopen(fname, "rb")))
return NULL;
fseek(f, 0, SEEK_END);
len = ftell(f);
rewind(f);
if(!(str = malloc(len+2)))
return NULL;
r = fread(str, 1, len, f);
if(r != len) {
free(str);
return NULL;
}
fclose(f);
str[len] = '\0';
return str;
}