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