b53689534ae29ca204f1fe0b2b8b04c58b82067f
[YACASL2.git] / src / cmem.c
1 #include "cmem.h"
2
3 void *malloc_chk(size_t size, const char *tag)
4 {
5     void *p = NULL;
6
7     if((p = malloc(size)) == NULL) {
8         fprintf(stderr, "%s: cannot allocate memory\n", tag);
9         exit(1);
10     }
11     return memset(p, 0, size);
12 }
13
14 void *calloc_chk(size_t nmemb, size_t size, const char *tag)
15 {
16     void *p = NULL;
17
18     if((p = calloc(nmemb, size)) == NULL) {
19         fprintf(stderr, "%s: cannot allocate memory\n", tag);
20         exit(1);
21     }
22     return p;
23 }
24
25 char *strdup_chk(const char *s, const char *tag)
26 {
27     assert(s != NULL);
28     char *t = NULL;
29
30     t = malloc_chk(strlen(s) + 1, tag);
31     strcpy(t, s);
32     return t;
33 }
34
35 char *strndup_chk(const char *s, size_t len, const char *tag)
36 {
37     assert(s != NULL);
38     char *t = NULL;
39
40     if(len < strlen(s)) {
41         t = malloc_chk(len + 1, tag);
42         strncpy(t, s, len);
43         t[len] = '\0';
44     } else {
45         t = strdup_chk(s, tag);
46     }
47     return t;
48 }
49
50 void strip_end(char *s)
51 {
52     for(int i = strlen(s) - 1; i > 0 && (s[i] == '\n' || s[i] == '\r' || s[i] == ' ' || s[i] == '\t'); i--) {
53         s[i] = '\0';
54     }
55 }
56
57 void strip_casl2_comment(char *s)
58 {
59     bool quoting = false;
60
61     for(int i = 0; s[i]; i++) {
62         /* 「'」で囲まれた文字列の場合。「''」は無視 */
63         if(s[i] == '\'' && s[i+1] != '\'' && (quoting == false || s[i-1] != '\'')) {
64             quoting = !quoting;
65         /* 「'」で囲まれた文字列でない場合、文字列末尾の「;」以降を削除 */
66         } else if(quoting == false && s[i] == ';') {
67             s[i] = '\0';
68             break;
69         }
70     }
71 }
72
73 }