OSDN Git Service

addid library source 20140221
[zither/ds-zither.git] / libms / safe_sprintf.c
1 // safe_sprintf.c
2 // masashi shimakura 20140223
3
4
5 #include<stdio.h>
6 #include<string.h>
7 #include<stdlib.h>
8 #include<stdarg.h>
9 #include <errno.h>
10
11 #include "libms.h"
12
13
14
15 __attribute__((__format__(__printf__, 3, 4))) char * safe_sprintf(char * data, long int max_len, const char * fmt,...)
16 {
17 FILE * fp;
18 va_list args;
19 long int len;
20
21 if(data == NULL){
22    data = (char *)calloc(BUF_LEN, sizeof(char));
23    }
24 else{
25    data = null_free(data);
26    }
27
28 va_start(args, fmt);
29 if((fp = fopen("/dev/null", "w+"))!=NULL){
30    len = vfprintf(fp, fmt, args);
31    fclose(fp);
32    }
33 else{
34    len = vfprintf(stderr, fmt, args);
35    }
36 va_end(args);
37
38 va_start(args, fmt);
39 if(len > 0){
40    if(len > max_len){
41       len = max_len;
42       }
43    if((data = (char *)realloc(data, (len + 2) * sizeof(char)))==NULL){
44       fprintf(stderr,"The memory cannot be newly secured. \n");
45       mlexit();
46       }
47    vsnprintf(data, (len + 1), fmt, args);
48    }
49 va_end(args);
50
51 return data;
52 }
53
54
55