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