Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Sam Breed
committed
Feb 20, 2012
1 parent
b3f786e
commit c72ca93
Showing
3 changed files
with
148 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
#ifndef __dbg_h__ | ||
#define __dbg_h__ | ||
|
||
#include <stdio.h> | ||
#include <errno.h> | ||
#include <string.h> | ||
|
||
#ifdef NDEBUG | ||
#define debug(M, ...) | ||
#else | ||
#define debug(M, ...) fprintf(stderr, "DEBUG %s:%d: " M "\n", __FILE__, __LINE__, ##__VA_ARGS__) | ||
#endif | ||
|
||
#define clean_errno() (errno == 0 ? "None" : strerror(errno)) | ||
|
||
#define log_err(M, ...) fprintf(stderr, "[ERROR] (%s:%d: errno %s) " M "\n", __FILE__, __LINE__, clean_errno(), ##__VA_ARGS__) | ||
|
||
#define log_warn(M, ...) fprintf(stderr, "[WARN] (%s:%d: errno %s) " M "\n", __FILE__, __LINE__, clean_errno(), ##__VA_ARGS__) | ||
|
||
#define log_info(M, ...) fprintf(stderr, "[INFO] (%s:%d) " M "\n", __FILE__, __LINE__, ##__VA_ARGS__) | ||
|
||
#define check(A, M, ...) if(!(A)) { log_err(M, ##__VA_ARGS__); errno=0; goto error; } | ||
|
||
#define sentinel(M, ...) { log_err(M, ##__VA_ARGS__); errno=0; goto error; } | ||
|
||
#define check_mem(A) check((A), "out of memory") | ||
|
||
#define check_debug(A, M, ...) if(!(A)) { debug(M, ##__VA_ARGS__); errno=0; goto error; } | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
#include "dbg.h" | ||
#include <stdlib.h> | ||
#include <stdio.h> | ||
|
||
|
||
void test_debug() | ||
{ | ||
debug("I have brown hair"); | ||
debug("I am %d years old", 25); | ||
} | ||
|
||
void test_log_err() | ||
{ | ||
log_err("shit's broke"); | ||
log_err("ther are %d problems in %s", 0, "space"); | ||
} | ||
|
||
void test_log_warn() | ||
{ | ||
log_warn("you can safely ignore this"); | ||
log_warn("maybe consider having a look at: %s", "/etc/passwd"); | ||
} | ||
|
||
void test_log_info() | ||
{ | ||
log_info("this is something"); | ||
log_info("it happened %f times today", 1.3f); | ||
} | ||
|
||
int test_check(char *file_name) | ||
{ | ||
FILE *input = NULL; | ||
char *block = NULL; | ||
|
||
block = malloc(100); | ||
check_mem(block); | ||
|
||
input = fopen(file_name, "r"); | ||
check(input, "failed to open %s", file_name); | ||
|
||
free(block); | ||
fclose(input); | ||
return 0; | ||
|
||
error: | ||
if(block) free(block); | ||
if(input) fclose(input); | ||
return -1; | ||
} | ||
|
||
int test_sentinel(int code) | ||
{ | ||
char *temp = malloc(100); | ||
check_mem(temp); | ||
|
||
switch(code) { | ||
case 1: | ||
log_info("it worked"); | ||
break; | ||
default: | ||
sentinel("I shouldn't run"); | ||
} | ||
|
||
free(temp); | ||
return 0; | ||
|
||
error: | ||
if(temp) free(temp); | ||
return -1; | ||
} | ||
|
||
int test_check_mem() | ||
{ | ||
char *test = NULL; | ||
check_mem(test); | ||
|
||
free(test); | ||
return 1; | ||
|
||
error: | ||
return -1; | ||
} | ||
|
||
int test_check_debug() | ||
{ | ||
int i = 0; | ||
check_debug(i != 0, "oops, i was 0"); | ||
|
||
return 0; | ||
|
||
error: | ||
return -1; | ||
} | ||
|
||
int main(int argc, char *argv[]) | ||
{ | ||
check(argc == 2, "Need an argument"); | ||
|
||
test_debug(); | ||
test_log_err(); | ||
test_log_warn(); | ||
test_log_info(); | ||
|
||
check(test_check("ex20.c") == 0, "failed with ex20.c"); | ||
check(test_check(argv[1]) == -1, "failed with argv"); | ||
check(test_sentinel(1) == 0, "test_sentinel failed"); | ||
check(test_sentinel(100) == -1, "test_sentinel failed"); | ||
check(test_check_mem() == -1, "test_check_mem failed"); | ||
check(test_check_debug() == -1, "test_check_debug failed"); | ||
|
||
return 0; | ||
|
||
error: | ||
return 1; | ||
} | ||
|
||
|