]> jfr.im git - irc/quakenet/newserv.git/blame - chanserv/q9snprintf.c
A4STATS: remove E style escapes and switch to createtable for indices
[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"
b7eebdcc 8#include "../lib/ccassert.h"
fdfed71a 9#include "../core/error.h"
0a50621f 10#include "chanserv_messages.h"
b7ed259b
CP
11
12#define MAXARGS 10
fdfed71a 13#define CONVBUF 512
b7ed259b 14
b7eebdcc
CP
15void q9strftime(char *buf, size_t size, time_t t) {
16 strftime(buf, size, Q9_FORMAT_TIME, gmtime(&t));
17}
18
b7ed259b 19void q9vsnprintf(char *buf, size_t size, const char *format, const char *args, va_list ap) {
ba8a65c4 20 StringBuf b;
b7ed259b
CP
21 const char *p;
22 char *c;
b7eebdcc 23
fdfed71a 24 char convbuf[MAXARGS][CONVBUF];
b7ed259b 25
b7eebdcc
CP
26 CCASSERT(CONVBUF > TIMELEN);
27
b7ed259b
CP
28 if(size == 0)
29 return;
30
31 {
fdfed71a
CP
32 int argno = 0, i;
33
34 int d;
b7ed259b 35 char *s;
fdfed71a
CP
36 double g;
37 unsigned int u;
79313d98 38 time_t t;
b7ed259b
CP
39
40 for(i=0;i<MAXARGS;i++)
41 convbuf[i][0] = '\0';
42
fdfed71a
CP
43 for(;*args;args++) {
44 char *cb = convbuf[argno++];
45
46 switch(*args) {
b7ed259b
CP
47 case 's':
48 s = va_arg(ap, char *);
fdfed71a 49 snprintf(cb, CONVBUF, "%s", s);
b7ed259b
CP
50 break;
51 case 'd':
52 d = va_arg(ap, int);
fdfed71a
CP
53 snprintf(cb, CONVBUF, "%d", d);
54 break;
55 case 'u':
56 u = va_arg(ap, unsigned int);
57 snprintf(cb, CONVBUF, "%u", u);
b7ed259b
CP
58 break;
59 case 'g':
fdfed71a
CP
60 g = va_arg(ap, double);
61 snprintf(cb, CONVBUF, "%.1f", g);
b7ed259b 62 break;
79313d98
CP
63 case 'T':
64 t = va_arg(ap, time_t);
b7eebdcc 65 q9strftime(cb, CONVBUF, t);
79313d98 66 break;
fdfed71a
CP
67 default:
68 /* calls exit(0) */
69 Error("chanserv", ERR_STOP, "Bad format specifier '%c' supplied in q9vsnprintf, format: '%s'", *args, format);
b7ed259b
CP
70 }
71 }
72 }
73
4a3ebc9e 74 sbinit(&b, buf, size);
b7ed259b
CP
75
76 for(p=format;*p;p++) {
77 if(*p != '$') {
ba8a65c4 78 if(!sbaddchar(&b, *p))
b7ed259b
CP
79 break;
80 continue;
81 }
82 p++;
83 if(*p == '\0')
84 break;
85 if(*p == '$') {
ba8a65c4 86 if(!sbaddchar(&b, *p))
b7ed259b
CP
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)
ba8a65c4 114 if(!sbaddstr(&b, c))
b7ed259b
CP
115 break;
116 }
117
0be0b2d0 118 sbterminate(&b);
b7ed259b
CP
119
120 /* not required */
121 /*
122 buf[size-1] = '\0';
123 */
124}
125
126void 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}