Mercurial > hg > dmlib
diff dmlib.c @ 0:32250b436bca
Initial re-import.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 28 Sep 2012 01:54:23 +0300 |
parents | |
children | dd9809a93425 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dmlib.c Fri Sep 28 01:54:23 2012 +0300 @@ -0,0 +1,199 @@ +#include "dmlib.h" +#include <errno.h> + + +int dmVerbosity = 0; +char *dmProgName = NULL, + *dmProgDesc = NULL, + *dmProgVersion = NULL, + *dmProgAuthor = NULL, + *dmProgLicense = NULL; + + +void dmInitProg(char *name, char *desc, char *version, char *author, char *license) +{ + dmProgName = name; + dmProgDesc = desc; + dmProgVersion = version; + + if (author) + dmProgAuthor = author; + else + dmProgAuthor = DM_PROG_AUTHOR; + + if (license) + dmProgLicense = license; + else + dmProgLicense = DM_PROG_LICENSE; + +} + + +void dmPrintBanner(FILE *outFile, const char *name, const char *usage) +{ + fprintf(outFile, + "\n%s v%s (%s)\n" + "%s\n" + "%s\n" + "Usage: %s %s\n", + dmProgName, dmProgVersion, dmProgDesc, + dmProgAuthor, dmProgLicense, name, usage); +} + + +void dmMsgVA(int level, const char *fmt, va_list ap) +{ + if (dmVerbosity >= level) + { + fprintf(stderr, "%s: ", dmProgName); + vfprintf(stderr, fmt, ap); + } +} + + +void dmPrintVA(int level, const char *fmt, va_list ap) +{ + if (dmVerbosity >= level) + { + vfprintf(stderr, fmt, ap); + } +} + + +void dmErrorVA(const char *fmt, va_list ap) +{ + fprintf(stderr, "%s: ", dmProgName); + vfprintf(stderr, fmt, ap); +} + + +void dmError(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + dmErrorVA(fmt, ap); + va_end(ap); +} + + +void dmMsg(int level, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + dmMsgVA(level, fmt, ap); + va_end(ap); +} + + +void dmPrint(int level, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + dmPrintVA(level, fmt, ap); + va_end(ap); +} + + +/* Memory handling routines + */ +void *dmMalloc(size_t l) +{ + return malloc(l); +} + + +void *dmMalloc0(size_t l) +{ + return calloc(1, l); +} + + +void *dmCalloc(size_t n, size_t l) +{ + return calloc(n, l); +} + + +void *dmRealloc(void *p, size_t l) +{ + return realloc(p, l); +} + + +void dmFree(void *p) +{ + /* Check for NULL pointers for portability due to some libc + * implementations not handling free(NULL) too well. + */ + if (p) free(p); +} + + +BOOL dmGetIntVal(const char *s, int *i) +{ + if (s[0] == '$') + { + if (sscanf(&s[1], "%x", i) < 1) + return FALSE; + } + else if (s[0] == '0' && s[1] == 'x') + { + if (sscanf(&s[2], "%x", i) < 1) + return FALSE; + } + else + { + if (sscanf(s, "%u", i) < 1) + return FALSE; + } + return TRUE; +} + + +/* Error handling + */ +#define DM_SYSTEM_ERRORS 100000 + +int dmGetErrno() +{ + return DM_SYSTEM_ERRORS + errno; +} + + +const char *dmErrorStr(int error) +{ + if (error >= DM_SYSTEM_ERRORS) + return strerror(error - DM_SYSTEM_ERRORS); + + switch (error) + { + case DMERR_OK: return "No error"; + case DMERR_FOPEN: return "File open error"; + case DMERR_FREAD: return "Read error"; + case DMERR_FWRITE: return "Write error"; + case DMERR_FSEEK: return "Seek error"; + case DMERR_NOT_FOUND: return "Resource not found"; + + case DMERR_INVALID_DATA: return "Invalid data"; + case DMERR_MALLOC: return "Memory allocation failure"; + case DMERR_ALREADY_INIT: return "Already initialized"; + case DMERR_INIT_FAIL: return "Initialization failed"; + case DMERR_INVALID_ARGS: return "Invalid arguments"; + + case DMERR_NULLPTR: return "NULL pointer"; + case DMERR_NOT_SUPPORTED: return "Operation not supported"; + case DMERR_OUT_OF_DATA: return "Out of data"; + case DMERR_EXTRA_DATA: return "Extra data"; + case DMERR_BOUNDS: return "Bounds check failed"; + + case DMERR_NOTPACK: return "File is not a PACK"; + case DMERR_VERSION: return "Unsupported PACK version"; + case DMERR_INVALID: return "Invalid data, corrupted file"; + case DMERR_COMPRESSION: return "Error in compression"; + + default: return "Unknown error"; + } +}