backup
[lcr.git] / save.h
1 /*****************************************************************************\
2 **                                                                           **
3 ** PBX4Linux                                                                 **
4 **                                                                           **
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg                                              **
7 **                                                                           **
8 ** Macros to do save string operations to avoid buffer overflows.            **
9 **                                                                           **
10 \*****************************************************************************/ 
11
12
13 /* save strcpy/strncpy */
14
15 #define SCPY(dst, src) scpy(dst, src, sizeof(dst))
16 extern __inline__ void scpy(char *dst, char *src, unsigned int siz)
17 {
18         strncpy(dst, src, siz);
19         dst[siz-1] = '\0';
20 }
21
22 /* save strcat/strncat */
23
24 #define SCAT(dst, src) scat(dst, src, sizeof(dst))
25 extern __inline__ void scat(char *dst, char *src, unsigned int siz)
26 {
27         strncat(dst, src, siz);
28         dst[siz-1] = '\0';
29 }
30
31 /* save concat of a byte */
32
33 #define SCCAT(dst, src) sccat(dst, src, sizeof(dst))
34 extern __inline__ void sccat(char *dst, char chr, unsigned int siz)
35 {
36         if (strlen(dst) < siz-1)
37         {
38                 dst[strlen(dst)+1] = '\0';
39                 dst[strlen(dst)] = chr;
40         }
41 }
42
43 /* save sprintf/snprintf */
44
45 #define SPRINT(dst, fmt, arg...) sprint(dst, sizeof(dst), fmt, ## arg)
46 extern __inline__ void sprint(char *dst, unsigned int siz, char *fmt, ...)
47 {
48         va_list args;
49
50         va_start(args, fmt);
51         vsnprintf(dst, siz, fmt, args);
52         dst[siz-1] = '\0';
53         va_end(args);
54 }
55
56 /* unsave */
57 #define UCPY strcpy
58 #define UNCPY strncpy
59 #define UCAT strcat
60 #define UNCAT strncat
61 #define UPRINT sprintf
62 #define UNPRINT snprintf
63 #define VUNPRINT vsnprintf
64