]> jfr.im git - irc/quakenet/newserv.git/blame - chanserv/q9snprintf.c
Export printchannels in newsearch.
[irc/quakenet/newserv.git] / chanserv / q9snprintf.c
CommitLineData
b7ed259b
CP
1#include <stdio.h>
2#include <stdlib.h>
3#include <stdarg.h>
4#include <string.h>
79313d98 5#include <time.h>
b7ed259b 6#include "../lib/sstring.h"
ba8a65c4 7#include "../lib/stringbuf.h"
fdfed71a 8#include "../core/error.h"
0a50621f 9#include "chanserv_messages.h"
b7ed259b
CP
10
11#define MAXARGS 10
fdfed71a 12#define CONVBUF 512
b7ed259b 13
b7ed259b 14void q9vsnprintf(char *buf, size_t size, const char *format, const char *args, va_list ap) {
ba8a65c4 15 StringBuf b;
b7ed259b
CP
16 const char *p;
17 char *c;
fdfed71a 18 char convbuf[MAXARGS][CONVBUF];
b7ed259b
CP
19
20 if(size == 0)
21 return;
22
23 {
fdfed71a
CP
24 int argno = 0, i;
25
26 int d;
b7ed259b 27 char *s;
fdfed71a
CP
28 double g;
29 unsigned int u;
79313d98 30 time_t t;
b7ed259b
CP
31
32 for(i=0;i<MAXARGS;i++)
33 convbuf[i][0] = '\0';
34
fdfed71a
CP
35 for(;*args;args++) {
36 char *cb = convbuf[argno++];
37
38 switch(*args) {
b7ed259b
CP
39 case 's':
40 s = va_arg(ap, char *);
fdfed71a 41 snprintf(cb, CONVBUF, "%s", s);
b7ed259b
CP
42 break;
43 case 'd':
44 d = va_arg(ap, int);
fdfed71a
CP
45 snprintf(cb, CONVBUF, "%d", d);
46 break;
47 case 'u':
48 u = va_arg(ap, unsigned int);
49 snprintf(cb, CONVBUF, "%u", u);
b7ed259b
CP
50 break;
51 case 'g':
fdfed71a
CP
52 g = va_arg(ap, double);
53 snprintf(cb, CONVBUF, "%.1f", g);
b7ed259b 54 break;
79313d98
CP
55 case 'T':
56 t = va_arg(ap, time_t);
0a50621f 57 strftime(cb, 15, Q9_FORMAT_TIME, gmtime(&t));
79313d98 58 break;
fdfed71a
CP
59 default:
60 /* calls exit(0) */
61 Error("chanserv", ERR_STOP, "Bad format specifier '%c' supplied in q9vsnprintf, format: '%s'", *args, format);
b7ed259b
CP
62 }
63 }
64 }
65
4a3ebc9e 66 sbinit(&b, buf, size);
b7ed259b
CP
67
68 for(p=format;*p;p++) {
69 if(*p != '$') {
ba8a65c4 70 if(!sbaddchar(&b, *p))
b7ed259b
CP
71 break;
72 continue;
73 }
74 p++;
75 if(*p == '\0')
76 break;
77 if(*p == '$') {
ba8a65c4 78 if(!sbaddchar(&b, *p))
b7ed259b
CP
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)
ba8a65c4 106 if(!sbaddstr(&b, c))
b7ed259b
CP
107 break;
108 }
109
0be0b2d0 110 sbterminate(&b);
b7ed259b
CP
111
112 /* not required */
113 /*
114 buf[size-1] = '\0';
115 */
116}
117
118void 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}