12 #include <sys/types.h>
18 #define MESSAGE_MAX_SIZE 20480
31 int len = strlen(haystack);
33 for (i = 0; i < len; i++) {
34 if (haystack[i] == needle) {
41 #ifdef DEBUG_TO_FILE___
49 static int fsize(
const char *file) {
52 if(stat(file, &st) == 0) {
60 void print_debug(FILE *std,
const char *color,
const char* file,
int line,
61 char *va_format, ...) {
65 char *from_pointer = va_format;
67 char *to_pointer = va_format;
68 int args_count =
chr_count(va_format,
'%');
69 const char *no_memory =
70 "Not enought memory in buffer to build debug message";
76 s = strrchr(file,
'/');
83 sprintf(header,
"%s[%d][%s:%04d] ", color, (
int)getpid(), file, line);
86 fprintf(stderr,
"%s[%d][%s:%d] Error, va_arg input format (va_format) "
89 printf(
"some rror\n");
93 int message_length = 20480;
94 memset(message,
'\0',
sizeof(
char) * message_length);
96 va_start(va, va_format);
101 for (args_pos = 1; (from_pointer && *from_pointer !=
'\0');
102 from_pointer = to_pointer) {
104 to_pointer = strchr(from_pointer,
'%');
106 if (to_pointer && strlen(to_pointer) > 1) {
107 copy_length = to_pointer - from_pointer;
109 if (copy_length > message_length - message_used) {
110 fprintf(stderr,
"%s[%d][%s:%d] %s%s\n",
ANSI_COLOR_RED, (
int)getpid(),
115 strncpy(message + message_used, from_pointer, copy_length);
116 message_used += copy_length;
118 switch(to_pointer[1]) {
121 s = va_arg(va,
char *);
123 copy_length = strlen(s);
124 if (copy_length > message_length - message_used) {
129 strncpy(message + message_used, s, copy_length);
130 message_used += copy_length;
134 strncpy(message + message_used,
"NULL", copy_length);
135 message_used += copy_length;
140 c = (char)va_arg(va,
int);
142 if (copy_length > message_length - message_used) {
143 fprintf(stderr,
"%s[%d][%s:%d] %s%s\n",
ANSI_COLOR_RED, (
int)getpid(),
147 strncpy(message + message_used, &c, copy_length);
148 message_used += copy_length;
153 char *d_char = (
char *)malloc(
sizeof(
char) * 10);
154 memset(d_char,
'\0', 10);
155 sprintf(d_char,
"%d", d);
156 copy_length = strlen(d_char);
157 if (copy_length > message_length - message_used) {
158 fprintf(stderr,
"%s[%d][%s:%d] %s%s\n",
ANSI_COLOR_RED, (
int)getpid(),
163 strncpy(message + message_used, d_char, copy_length);
164 message_used += copy_length;
174 strcat(message, from_pointer);
178 if(args_pos > args_count) {
188 #ifdef DEBUG_TO_FILE___
190 const char debug_file[] =
"debug.log";
192 int file_size =
fsize(debug_file);
194 int max_size = 512000;
196 if (file_size > max_size) {
197 fh = fopen(debug_file,
"w");
201 fh = fopen(debug_file,
"a");
205 fprintf(stderr,
"%s[%d][%s:%d] Failed to create debug file%s\n",
224 for (i = 0; i < argc; ++i) {
225 cmdline_len += strlen(argv[i]) + 1;
228 cmdline = malloc(cmdline_len + 1);
231 for (i = 0; i < argc; ++i) {
232 strcat(cmdline, argv[i]);
233 strcat (cmdline,
" ");
236 PRINT_DEBUG(
"%s", cmdline);
static int fsize(const char *file)
void print_debug(FILE *std, const char *color, const char *file, int line, char *va_format,...)
void log_start_args(int argc, char **argv)
static int chr_count(char *haystack, char needle)