]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/q9snprintf.c
A4STATS: remove E style escapes and switch to createtable for indices
[irc/quakenet/newserv.git] / chanserv / q9snprintf.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdarg.h>
4 #include <string.h>
5 #include <time.h>
6 #include "../lib/sstring.h"
7 #include "../lib/stringbuf.h"
8 #include "../lib/ccassert.h"
9 #include "../core/error.h"
10 #include "chanserv_messages.h"
11
12 #define MAXARGS 10
13 #define CONVBUF 512
14
15 void q9strftime(char *buf, size_t size, time_t t) {
16 strftime(buf, size, Q9_FORMAT_TIME, gmtime(&t));
17 }
18
19 void q9vsnprintf(char *buf, size_t size, const char *format, const char *args, va_list ap) {
20 StringBuf b;
21 const char *p;
22 char *c;
23
24 char convbuf[MAXARGS][CONVBUF];
25
26 CCASSERT(CONVBUF > TIMELEN);
27
28 if(size == 0)
29 return;
30
31 {
32 int argno = 0, i;
33
34 int d;
35 char *s;
36 double g;
37 unsigned int u;
38 time_t t;
39
40 for(i=0;i<MAXARGS;i++)
41 convbuf[i][0] = '\0';
42
43 for(;*args;args++) {
44 char *cb = convbuf[argno++];
45
46 switch(*args) {
47 case 's':
48 s = va_arg(ap, char *);
49 snprintf(cb, CONVBUF, "%s", s);
50 break;
51 case 'd':
52 d = va_arg(ap, int);
53 snprintf(cb, CONVBUF, "%d", d);
54 break;
55 case 'u':
56 u = va_arg(ap, unsigned int);
57 snprintf(cb, CONVBUF, "%u", u);
58 break;
59 case 'g':
60 g = va_arg(ap, double);
61 snprintf(cb, CONVBUF, "%.1f", g);
62 break;
63 case 'T':
64 t = va_arg(ap, time_t);
65 q9strftime(cb, CONVBUF, t);
66 break;
67 default:
68 /* calls exit(0) */
69 Error("chanserv", ERR_STOP, "Bad format specifier '%c' supplied in q9vsnprintf, format: '%s'", *args, format);
70 }
71 }
72 }
73
74 sbinit(&b, buf, size);
75
76 for(p=format;*p;p++) {
77 if(*p != '$') {
78 if(!sbaddchar(&b, *p))
79 break;
80 continue;
81 }
82 p++;
83 if(*p == '\0')
84 break;
85 if(*p == '$') {
86 if(!sbaddchar(&b, *p))
87 break;
88 continue;
89 }
90
91 c = NULL;
92 switch(*p) {
93 /*
94 case 'C':
95 c = botname; break;
96 case 'N':
97 c = network; break;
98 */
99 case '0':
100 case '1':
101 case '2':
102 case '3':
103 case '4':
104 case '5':
105 case '6':
106 case '7':
107 case '8':
108 case '9':
109 c = convbuf[*p - '0']; break;
110 default:
111 c = "(bad format specifier)";
112 }
113 if(c)
114 if(!sbaddstr(&b, c))
115 break;
116 }
117
118 sbterminate(&b);
119
120 /* not required */
121 /*
122 buf[size-1] = '\0';
123 */
124 }
125
126 void q9snprintf(char *buf, size_t size, const char *format, const char *args, ...) {
127 va_list ap;
128
129 va_start(ap, args);
130 q9vsnprintf(buf, size, format, args, ap);
131 va_end(ap);
132 }