File: log.c

package info (click to toggle)
udpcast 20120424-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, buster, sid, stretch, trixie
  • size: 876 kB
  • ctags: 1,011
  • sloc: ansic: 7,713; sh: 2,838; perl: 227; makefile: 114
file content (143 lines) | stat: -rw-r--r-- 2,872 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <stdarg.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <sys/time.h>
#include <string.h>
#include "log.h"

static int needNewline=0;

static void printNewlineIfNeeded(void) {
    if (needNewline) {
	fprintf(stderr, "\n");
    }
    needNewline=0;
}

static int vlogprintf(FILE *logfile, const char *fmt, va_list ap);

/**
 * Print message to the log, if not null
 */
int logprintf(FILE *logfile, const char *fmt, ...) {
    va_list ap;

    va_start(ap, fmt);
    return vlogprintf(logfile, fmt, ap);
}

static int newlineSeen=1;

static int vlogprintf(FILE *logfile, const char *fmt, va_list ap) {
    if(logfile != NULL) {	
	char buf[9];
	struct timeval tv;
	int r;
	if(newlineSeen) {
	    gettimeofday(&tv, NULL);
	    strftime(buf, sizeof(buf), "%H:%M:%S", localtime(&tv.tv_sec));
	    fprintf(logfile, "%s.%06ld ", buf, tv.tv_usec);
	}
	newlineSeen = (strchr(fmt, '\n') != NULL);
	r= vfprintf(logfile, fmt, ap);
	if(newlineSeen)
	    fflush(logfile);
	return r;
    } else
	return -1;
}

/**
 * Print message to stdout, adding a newline "if needed"
 * A newline is needed if this function has not yet been invoked
 * since last statistics printout
 */
int flprintf(const char *fmt, ...) {
    va_list ap;

    va_start(ap, fmt);

    if(udpc_log)
	return vlogprintf(udpc_log, fmt, ap);
    else {
	printNewlineIfNeeded();
	return vfprintf(stderr, fmt, ap);
    }
}

volatile int quitting = 0;

/**
 * Print message to stdout, adding a newline "if needed"
 * A newline is needed if this function has not yet been invoked
 * since last statistics printout
 */
int fatal(int code, const char *fmt, ...) {
    va_list ap;

    va_start(ap, fmt);

    if(quitting)
	_exit(code);
    quitting=1;
    
    printNewlineIfNeeded();
    vfprintf(stderr, fmt, ap);
#if 0
    assert(0); /* make it easyer to use a debugger to see where this came 
		* from */
#endif
    exit(code);
}

int printLongNum(unsigned long long x) {
/*    fprintf(stderr, "%03d ", (int) ( x / 1000000000000LL   ));*/
    long long divisor;
    long long minDivisor;
    int nonzero;
    char suffix=' ';

    if(x > 1000000000000LL) {
	minDivisor = 1048576L;
	suffix='M';	
    } else if(x >= 1000000000) {
	minDivisor = 1024L;
	suffix='K';
    } else {
	minDivisor = 1;
	suffix=' ';
    }
    divisor = minDivisor * 1000000LL;

    nonzero = 0;

    while(divisor >= minDivisor) {
	int digits;
	const char *format;

	digits = (int) ((x / divisor) % 1000);
	if (nonzero) {
	    format = "%03d";
	} else {
	    format = "%3d";
	}
	if (digits || nonzero)
	    fprintf(stderr, format, digits);
	else
	    fprintf(stderr, "    ");
	    
	if(digits) {
	    nonzero = 1;
	}
	divisor = divisor / 1000;
	if(divisor >= minDivisor)
	    fprintf(stderr, " ");
	else
	    fprintf(stderr, "%c", suffix);
    }
    needNewline = 1;
    return 0;
}