OSDN Git Service

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