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
|
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include "util.h"
#include "debug.h" /* Probably shouldn't have debug in utils */
char *
s_cpy(const char *str)
{
if (str == NULL)
return NULL;
char *ret = malloc(strlen(str) + 1);
if (ret == NULL)
error("Not enough memory\n");
strcpy(ret, str);
return ret;
}
char *
s_con(const char *str, ...)
{
size_t len;
va_list args;
const char *ar;
char *ret, *p;
len = strlen(str) + 1;
va_start(args, str);
while (ar = va_arg(args, const char*))
len += strlen(ar);
va_end(args);
ret = malloc(len);
if (ret == NULL)
error("Not enough memory\n");
p = stpcpy(ret, str);
va_start(args, str);
while (ar = va_arg(args, const char*))
p = stpcpy(p, ar);
va_end(args);
return ret;
}
char *
f_read(const char *path)
{
FILE *f;
char *buf;
long bsize;
buf = NULL;
if ((f = fopen(path, "r")) == NULL)
goto fread_deffer;
if (fseek(f, 0L, SEEK_END))
goto fread_deffer;
if ((bsize = ftell(f)) == -1)
goto fread_deffer;
buf = calloc(sizeof(*buf), bsize + 1);
if (buf == NULL)
goto fread_deffer;
if (fseek(f, 0L, SEEK_SET))
goto fread_deffer;
bsize = (long) fread(buf, sizeof(*buf), bsize, f);
if (ferror(f) != 0)
goto fread_deffer;
buf[bsize] = '\0';
fclose(f);
return buf;
fread_deffer:
if (f)
fclose(f);
if (buf)
free(buf);
return NULL;
}
|