YACASL2
Loading...
Searching...
No Matches
cmem.c
Go to the documentation of this file.
1#include "cmem.h"
2
3long str2l_range(const char *str, long min, long max, const char *name) {
4 char *endptr = NULL;
5 long val = strtol(str, &endptr, 10);
6 if(endptr == str) {
7 fprintf(stderr, "%s: Not specified.\n", name);
8 return 0;
9 } else if(*endptr != '\0') {
10 fprintf(stderr, "%s: `%s' is not integer.\n", name, str);
11 return 0;
12 } else if(val < min || max < val) {
13 if(max == LONG_MAX) {
14 fprintf(stderr, "%s: %s out of range: %ld -\n", str, name, min);
15 } else {
16 fprintf(stderr, "%s: %s out of range: %ld - %ld\n", str, name, min, max);
17 }
18 return 0;
19 }
20 return val;
21}
22
23void *malloc_chk(size_t size, const char *tag)
24{
25 void *p = NULL;
26
27 if((p = malloc(size)) == NULL) {
28 fprintf(stderr, "%s: cannot allocate memory\n", tag);
29 exit(1);
30 }
31 return memset(p, 0, size);
32}
33
34void *calloc_chk(size_t nmemb, size_t size, const char *tag)
35{
36 void *p = NULL;
37
38 if((p = calloc(nmemb, size)) == NULL) {
39 fprintf(stderr, "%s: cannot allocate memory\n", tag);
40 exit(1);
41 }
42 return p;
43}
44
45char *strdup_chk(const char *s, const char *tag)
46{
47 assert(s != NULL);
48 char *t = malloc_chk(strlen(s) + 1, tag);
49 strcpy(t, s);
50 return t;
51}
52
53char *strndup_chk(const char *s, size_t len, const char *tag)
54{
55 assert(s != NULL);
56 char *t = NULL;
57
58 if(len < strlen(s)) {
59 t = malloc_chk(len + 1, tag);
60 strncpy(t, s, len);
61 t[len] = '\0';
62 } else {
63 t = strdup_chk(s, tag);
64 }
65 return t;
66}
67
68void strip_end(char *s)
69{
70 for(int i = strlen(s) - 1; i > 0 && (s[i] == '\n' || s[i] == '\r' || s[i] == ' ' || s[i] == '\t'); i--) {
71 s[i] = '\0';
72 }
73}
74
76{
77 bool quoting = false;
78
79 for(int i = 0; s[i]; i++) {
80 /* 「'」で囲まれた文字列の場合。「''」は無視 */
81 if(s[i] == '\'' && s[i+1] != '\'' && (quoting == false || s[i-1] != '\'')) {
82 quoting = !quoting;
83 /* 「'」で囲まれた文字列でない場合、文字列末尾の「;」以降を削除 */
84 } else if(quoting == false && s[i] == ';') {
85 s[i] = '\0';
86 break;
87 }
88 }
89}
90
91char *strrev(const char *s)
92{
93 char *t = strdup_chk(s, "strrev.t");
94 int l = strlen(t);
95
96 for(int i = 0; i < l-1-i; i++) {
97 char tmp = t[i];
98 t[i] = t[l-1-i];
99 t[l-1-i] = tmp;
100 }
101 return t;
102}
void strip_end(char *s)
文字列の末尾から、改行と空白とタブを削除する
Definition cmem.c:68
char * strndup_chk(const char *s, size_t len, const char *tag)
malloc_chkを実行してメモリを確保し、コピーした文字列の指定した長さの部分を返す
Definition cmem.c:53
void * calloc_chk(size_t nmemb, size_t size, const char *tag)
領域の数とサイズを指定してメモリーを確保するcallocを実行する
Definition cmem.c:34
void strip_casl2_comment(char *s)
文字列から「'」以降の文字列をCASL IIのコメントとして削除する。「''」の場合は除く
Definition cmem.c:75
char * strrev(const char *s)
逆にした文字列を返す
Definition cmem.c:91
void * malloc_chk(size_t size, const char *tag)
mallocを実行し、0で初期化する
Definition cmem.c:23
long str2l_range(const char *str, long min, long max, const char *name)
数値文字列が特定の範囲の数値かチェックし、正の場合は変換した数値、不正の場合は0を返す
Definition cmem.c:3
char * strdup_chk(const char *s, const char *tag)
malloc_chkを実行してメモリを確保し、コピーした文字列を返す
Definition cmem.c:45