Data-Over-Voice
[lcr.git] / macro.h
diff --git a/macro.h b/macro.h
index fb070ba..08c8a9b 100644 (file)
--- a/macro.h
+++ b/macro.h
@@ -13,7 +13,7 @@
 
 /* safe strcpy/strncpy */
 
-#define SCPY(dst, src) scpy(dst, src, sizeof(dst))
+#define SCPY(dst, src) scpy((char *)dst, src, sizeof(dst))
 static inline void scpy(char *dst, const char *src, unsigned int siz)
 {
        strncpy(dst, src, siz);
@@ -22,16 +22,16 @@ static inline void scpy(char *dst, const char *src, unsigned int siz)
 
 /* safe strcat/strncat */
 
-#define SCAT(dst, src) scat(dst, src, sizeof(dst))
+#define SCAT(dst, src) scat((char *)dst, src, sizeof(dst))
 static inline void scat(char *dst, const char *src, unsigned int siz)
 {
-       strncat(dst, src, siz);
+       strncat(dst, src, siz-strlen(dst)-1);
        dst[siz-1] = '\0';
 }
 
 /* safe concat of a byte */
 
-#define SCCAT(dst, src) sccat(dst, src, sizeof(dst))
+#define SCCAT(dst, src) sccat((char *)dst, src, sizeof(dst))
 static inline void sccat(char *dst, char chr, unsigned int siz)
 {
        if (strlen(dst) < siz-1)
@@ -43,7 +43,7 @@ static inline void sccat(char *dst, char chr, unsigned int siz)
 
 /* safe sprintf/snprintf */
 
-#define SPRINT(dst, fmt, arg...) sprint(dst, sizeof(dst), fmt, ## arg)
+#define SPRINT(dst, fmt, arg...) sprint((char *)dst, sizeof(dst), fmt, ## arg)
 static inline void sprint(char *dst, unsigned int siz, const char *fmt, ...)
 {
        va_list args;
@@ -63,9 +63,9 @@ static inline void sprint(char *dst, unsigned int siz, const char *fmt, ...)
 #define UNPRINT snprintf
 #define VUNPRINT vsnprintf
 
+#define FATAL(fmt, arg...) _fatal(__FILE__, __FUNCTION__, __LINE__, fmt, ##arg)
 /* fatal error with error message and exit */
-#define FATAL(fmt, arg...) fatal(__FUNCTION__, __LINE__, fmt, ##arg)
-static inline void fatal(const char *function, int line, const char *fmt, ...)
+static inline void _fatal(const char *file, const char *function, int line, const char *fmt, ...)
 {
        va_list args;
        char buffer[256];
@@ -74,25 +74,25 @@ static inline void fatal(const char *function, int line, const char *fmt, ...)
        vsnprintf(buffer, sizeof(buffer), fmt, args);
        va_end(args);
        buffer[sizeof(buffer)-1] = '\0';
-       fprintf(stderr, "FATAL ERROR in function %s, line %d: %s", function, line, buffer);
+       fprintf(stderr, "FATAL ERROR in function %s/%s, line %d: %s", file, function, line, buffer);
        fprintf(stderr, "This error is not recoverable, must exit here.\n");
 #ifdef DEBUG_FUNC
-       debug(function, line, "FATAL ERROR", buffer);
-       debug(function, line, "FATAL ERROR", (char *)"This error is not recoverable, must exit here.\n");
+       debug(file, function, line, "FATAL", buffer);
+       debug(file, function, line, "FATAL", (char *)"This error is not recoverable, must exit here.\n");
 #endif
        exit(EXIT_FAILURE);
 }
 
 /* memory allocation with setting to zero */
-#define MALLOC(size) _malloc(size, __FUNCTION__, __LINE__)
-static inline void *_malloc(unsigned int size, const char *function, int line)
+#define MALLOC(size) _malloc(size, __FILE__, __FUNCTION__, __LINE__)
+static inline void *_malloc(unsigned int size, const char *file, const char *function, int line)
 {
        void *addr;
        addr = malloc(size);
        if (!addr)
-               fatal(function, line, "No memory for %d bytes.\n", size);
+               _fatal(file, function, line, "No memory for %d bytes.\n", size);
        memset(addr, 0, size);
-       return(addr);
+       return addr;
 }
 
 /* memory freeing with clearing memory to prevent using freed memory */
@@ -104,4 +104,20 @@ static inline void _free(void *addr, int size)
        free(addr);
 }
 
+/* fill buffer and be sure that it's result is 0-terminated, also remove newline */
+#define GETLINE(buffer, fp) _getline(buffer, sizeof(buffer), fp)
+static inline char *_getline(char *buffer, int size, FILE *fp)
+{
+       if (!fgets(buffer, size-1, fp))
+               return NULL;
+       buffer[size-1] = '\0';
+       if (!buffer[0])
+               return buffer;
+       if (buffer[strlen(buffer)-1] == '\n')
+               buffer[strlen(buffer)-1] = '\0';
+       if (buffer[strlen(buffer)-1] == '\r')
+               buffer[strlen(buffer)-1] = '\0';
+       return buffer;
+}
+