See ChangeLog: Thu Jul 1 12:47:31 CEST 1999 Werner Koch
[gnupg.git] / util / miscutil.c
1 /* miscutil.c -  miscellaneous utilities
2  *      Copyright (C) 1998, 1999 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * GnuPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #include <config.h>
22 #include <stdio.h>
23 #include <string.h>
24 #include <time.h>
25 #include <ctype.h>
26 #ifdef HAVE_LANGINFO_H
27   #include <langinfo.h>
28 #endif
29 #include "types.h"
30 #include "util.h"
31 #include "i18n.h"
32
33 u32
34 make_timestamp()
35 {
36     return time(NULL);
37 }
38
39 u32
40 add_days_to_timestamp( u32 stamp, u16 days )
41 {
42     return stamp + days*86400L;
43 }
44
45
46 /****************
47  * Return a string with a time value in the form: x Y, n D, n H
48  */
49
50 const char *
51 strtimevalue( u32 value )
52 {
53     static char buffer[30];
54     unsigned int years, days, hours, minutes;
55
56     value /= 60;
57     minutes = value % 60;
58     value /= 60;
59     hours = value % 24;
60     value /= 24;
61     days = value % 365;
62     value /= 365;
63     years = value;
64
65     sprintf(buffer,"%uy%ud%uh%um", years, days, hours, minutes );
66     if( years )
67         return buffer;
68     if( days )
69         return strchr( buffer, 'y' ) + 1;
70     return strchr( buffer, 'd' ) + 1;
71 }
72
73
74 /****************
75  * Note: this function returns GMT
76  */
77 const char *
78 strtimestamp( u32 stamp )
79 {
80     static char buffer[11+5];
81     struct tm *tp;
82     time_t atime = stamp;
83
84     tp = gmtime( &atime );
85     sprintf(buffer,"%04d-%02d-%02d",
86                     1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday );
87     return buffer;
88 }
89
90 /****************
91  * Note: this function returns local time
92  */
93 const char *
94 asctimestamp( u32 stamp )
95 {
96     static char buffer[50];
97     #if defined (HAVE_STRFTIME) && defined (HAVE_NL_LANGINFO)
98       static char fmt[50];
99     #endif
100     struct tm *tp;
101     time_t atime = stamp;
102
103     tp = localtime( &atime );
104   #ifdef HAVE_STRFTIME
105     #if defined(HAVE_NL_LANGINFO)
106       mem2str( fmt, nl_langinfo(D_T_FMT), DIM(fmt) );
107       if( strstr( fmt, "%Z" ) == NULL )
108         strcat( fmt, " %Z");
109       strftime( buffer, DIM(buffer)-1, fmt, tp );
110     #else
111       /* fixme: we should check whether the locale appends a " %Z"
112        * These locales from glibc don't put the " %Z":
113        * fi_FI hr_HR ja_JP lt_LT lv_LV POSIX ru_RU ru_SU sv_FI sv_SE zh_CN
114        */
115       strftime( buffer, DIM(buffer)-1, "%c %Z", tp );
116     #endif
117     buffer[DIM(buffer)-1] = 0;
118   #else
119     mem2str( buffer, asctime(tp), DIM(buffer) );
120   #endif
121     return buffer;
122 }
123
124 /****************
125  * Print a string to FP, but filter all control characters out.
126  */
127 void
128 print_string( FILE *fp, const byte *p, size_t n, int delim )
129 {
130     for( ; n; n--, p++ )
131         if( iscntrl( *p ) || *p == delim ) {
132             putc('\\', fp);
133             if( *p == '\n' )
134                 putc('n', fp);
135             else if( *p == '\r' )
136                 putc('r', fp);
137             else if( *p == '\f' )
138                 putc('f', fp);
139             else if( *p == '\v' )
140                 putc('v', fp);
141             else if( *p == '\b' )
142                 putc('b', fp);
143             else if( !*p )
144                 putc('0', fp);
145             else
146                 fprintf(fp, "x%02x", *p );
147         }
148         else
149             putc(*p, fp);
150 }
151
152 /****************
153  * This function returns a string which is suitable for printing
154  * Caller must release it with m_free()
155  */
156 char *
157 make_printable_string( const byte *p, size_t n, int delim )
158 {
159     size_t save_n, buflen;
160     const byte *save_p;
161     char *buffer, *d;
162
163     /* first count length */
164     for(save_n = n, save_p = p, buflen=1 ; n; n--, p++ ) {
165         if( iscntrl( *p ) || *p == delim ) {
166             if( *p=='\n' || *p=='\r' || *p=='\f'
167                 || *p=='\v' || *p=='\b' || !*p )
168                 buflen += 2;
169             else
170                 buflen += 3;
171         }
172         else
173             buflen++;
174     }
175     p = save_p;
176     n = save_n;
177     /* and now make the string */
178     d = buffer = m_alloc( buflen );
179     for( ; n; n--, p++ ) {
180         if( iscntrl( *p ) || *p == delim ) {
181             *d++ = '\\';
182             if( *p == '\n' )
183                 *d++ = 'n';
184             else if( *p == '\r' )
185                 *d++ = 'r';
186             else if( *p == '\f' )
187                 *d++ = 'f';
188             else if( *p == '\v' )
189                 *d++ = 'v';
190             else if( *p == '\b' )
191                 *d++ = 'b';
192             else if( !*p )
193                 *d++ = '0';
194             else {
195                 sprintf(d, "x%02x", *p );
196                 d += 2;
197             }
198         }
199         else
200             *d++ = *p;
201     }
202     *d = 0;
203     return buffer;
204 }
205
206
207 int
208 answer_is_yes( const char *s )
209 {
210     char *long_yes = _("yes");
211     char *short_yes = _("yY");
212
213     if( !stricmp(s, long_yes ) )
214         return 1;
215     if( strchr( short_yes, *s ) && !s[1] )
216         return 1;
217     return 0;
218 }
219
220
221 /****************
222  * Return 1 for yes, -1 for quit, or 0 for no
223  */
224 int
225 answer_is_yes_no_quit( const char *s )
226 {
227     char *long_yes = _("yes");
228     char *long_quit = _("quit");
229     char *short_yes = _("yY");
230     char *short_quit = _("qQ");
231
232     if( !stricmp(s, long_yes ) )
233         return 1;
234     if( !stricmp(s, long_quit ) )
235         return -1;
236     if( strchr( short_yes, *s ) && !s[1] )
237         return 1;
238     if( strchr( short_quit, *s ) && !s[1] )
239         return -1;
240     return 0;
241 }
242
243