A collection of helpers to do specific operations in ANSI C.
Instead of including entire libraries like stdlib.h
, string.h
and ctype.h
, one might prefer to manually select only the handful of functions that be used in a given project.
To see an example of these basic helpers used into projects, have a look at Oscean, Moogle, or Parade.
Integer maximum
int imax(int a, int b) { return a > b ? a : b; }
Integer minimum
int imin(int a, int b) { return a < b ? a : b; }
Character is alpha
int cial(char c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); }
Character is number
int cinu(char c) { return c >= '0' && c <= '9'; }
Character is space
int cisp(char c) { return c == ' ' || c == '\t' || c == '\n' || c == '\r'; }
Character is alphanumericspace
int cans(char c) { return cial(c) || cinu(c) || cisp(c); }
Character to lowercase
int clca(int c) { return c >= 'A' && c <= 'Z' ? c + ('a' - 'A') : c; }
Character to uppercase
int cuca(char c) { return c >= 'a' && c <= 'z' ? c - ('a' - 'A') : c; }
Character padding
int cpad(char* s, char c) { int i = 0; while(s[i] == c && s[i] != '\0' && s[++i]) ; return i; }
Character position
int cpos(char* s, char c) { int i = 0; while(s[i] != '\0' && s[i]) if(s[i++] == c) return i - 1; return -1; }
String length
int slen(char* s) { int n = 0; while(s[n] != '\0' && s[++n]) ; return n; }
String from character reverse
char* spor(char* s, int c) { int i; for(i = slen(s); i >= 0; --i) if(s[i] == c) return s + i; return s - 1; }
String to uppercase
char* suca(char* s) { int i; for(i = 0; i < slen(s); i++) s[i] = cuca(s[i]); return s; }
String to lowercase
char* slca(char* s) { int i; for(i = 0; i < slen(s); i++) s[i] = clca(s[i]); return s; }
String character swap
char* scsw(char* s, char a, char b) { int i; for(i = 0; i < slen(s); i++) s[i] = s[i] == a ? b : s[i]; return s; }
String compare
int scmp(char* a, char* b) { int i, l = slen(a); if(l != slen(b)) return 0; for(i = 0; i < l; ++i) if(a[i] != b[i]) return 0; return 1; }
String is alphanumericspace
int sans(char* s) { int i; for(i = 0; i < slen(s); i++) if(!cans(s[i])) return 0; return 1; }
String trim
char* strm(char* s) { char* end; while(cisp(*s)) s++; if(*s == 0) return s; end = s + slen(s) - 1; while(end > s && cisp(*end)) end--; end[1] = '\0'; return s; }
String position in string
int spos(char* a, char* b) { int i, j, alen = slen(a), blen = slen(b); for(i = 0; i < alen; i++) { for(j = 0; j < blen; j++) { if(a[i + j] == '\0') return -1; if(a[i + j] != b[j]) break; if(j == blen - 1) return i; } } return -1; }
String to int
int sint(char *s) { int i = 0, num = 0; while(s[i] && cinu(s[i])) num = num * 10 + (s[i++] - '0'); return num; }
String is url
int surl(char* s) { return spos(s, "://") >= 0 || spos(s, "./") >= 0; }
String copy
char* scpy(char* src, char* dest) { int i = 0; while((dest[i] = src[i]) != '\0') i++; return dest; }
String substring
char* sstr(char* src, char* dest, int from, int to) { int i; char *a = (char*)src + from, *b = (char*)dest; for(i = 0; i < to; i++) b[i] = a[i]; dest[to] = '\0'; return dest; }
Array find string
int afnd(char* src[], int len, char* val) { int i; for(i = 0; i < len; i++) if(scmp(src[i], val)) return i; return -1; }
String cat
char* scat(char* dest, const char* src) { char* ptr = dest + slen(dest); while(*src != '\0') *ptr++ = *src++; *ptr = '\0'; return dest; }
Character to hex value
unsigned char chex(char c) { if(c >= 'a' && c <= 'f') return 10 + c - 'a'; if(c >= 'A' && c <= 'F') return 10 + c - 'A'; return (c - '0') & 0xF; }
String to hex value
unsigned short shex(char* s) { int i, n = 0, l = slen(s); for(i = 0; i < l; ++i) n |= (chex(s[i]) << ((l - i - 1) * 4)); return n; }
Date
Leap Year
int leapyear(int y) { if(y % 400 == 0) return 1; else if(y % 100 == 0) return 0; else if(y % 4 == 0) return 1; return 0; }