root/src/cmem.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. str2l_range
  2. malloc_chk
  3. calloc_chk
  4. strdup_chk
  5. strndup_chk
  6. strip_end
  7. strip_casl2_comment
  8. strrev

   1 #include "cmem.h"
   2 
   3 long 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 
  23 void *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 
  34 void *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 
  45 char *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 
  53 char *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 
  68 void 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 
  75 void strip_casl2_comment(char *s)
  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 
  91 char *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 }

/* [<][>][^][v][top][bottom][index][help] */