summaryrefslogtreecommitdiffstats
path: root/util/miscutil.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/miscutil.c')
-rw-r--r--util/miscutil.c116
1 files changed, 70 insertions, 46 deletions
diff --git a/util/miscutil.c b/util/miscutil.c
index 9b4a8379f..e1735cd59 100644
--- a/util/miscutil.c
+++ b/util/miscutil.c
@@ -1,5 +1,5 @@
/* miscutil.c - miscellaneous utilities
- * Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
*
* This file is part of GnuPG.
*
@@ -27,7 +27,6 @@
#ifdef HAVE_LANGINFO_H
#include <langinfo.h>
#endif
-#include <gcrypt.h>
#include "types.h"
#include "util.h"
#include "i18n.h"
@@ -125,10 +124,15 @@ strtimestamp( u32 stamp )
static char buffer[11+5];
struct tm *tp;
time_t atime = stamp;
-
- tp = gmtime( &atime );
- sprintf(buffer,"%04d-%02d-%02d",
- 1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday );
+
+ if (atime < 0) {
+ strcpy (buffer, "????" "-??" "-??");
+ }
+ else {
+ tp = gmtime( &atime );
+ sprintf(buffer,"%04d-%02d-%02d",
+ 1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday );
+ }
return buffer;
}
@@ -145,6 +149,11 @@ asctimestamp( u32 stamp )
struct tm *tp;
time_t atime = stamp;
+ if (atime < 0) {
+ strcpy (buffer, "????" "-??" "-??");
+ return buffer;
+ }
+
tp = localtime( &atime );
#ifdef HAVE_STRFTIME
#if defined(HAVE_NL_LANGINFO)
@@ -173,7 +182,8 @@ void
print_string( FILE *fp, const byte *p, size_t n, int delim )
{
for( ; n; n--, p++ )
- if( iscntrl( *p ) || *p == delim ) {
+ if( *p < 0x20 || (*p >= 0x7f && *p < 0xa0) || *p == delim ||
+ (delim && *p=='\\')) {
putc('\\', fp);
if( *p == '\n' )
putc('n', fp);
@@ -198,7 +208,7 @@ print_string( FILE *fp, const byte *p, size_t n, int delim )
* Print an UTF8 string to FP and filter all control characters out.
*/
void
-print_utf8_string( FILE *fp, const byte *p, size_t n )
+print_utf8_string2 ( FILE *fp, const byte *p, size_t n, int delim )
{
size_t i;
char *buf;
@@ -209,17 +219,24 @@ print_utf8_string( FILE *fp, const byte *p, size_t n )
break;
}
if( i < n ) {
- buf = utf8_to_native( p, n );
+ buf = utf8_to_native ( p, n, delim );
+ /*(utf8 conversion already does the control character quoting)*/
fputs( buf, fp );
- gcry_free( buf );
+ m_free( buf );
}
else
- print_string( fp, p, n, 0 );
+ print_string( fp, p, n, delim );
+}
+
+void
+print_utf8_string( FILE *fp, const byte *p, size_t n )
+{
+ print_utf8_string2 (fp, p, n, 0);
}
/****************
* This function returns a string which is suitable for printing
- * Caller must release it with gcry_free()
+ * Caller must release it with m_free()
*/
char *
make_printable_string( const byte *p, size_t n, int delim )
@@ -230,7 +247,8 @@ make_printable_string( const byte *p, size_t n, int delim )
/* first count length */
for(save_n = n, save_p = p, buflen=1 ; n; n--, p++ ) {
- if( iscntrl( *p ) || *p == delim ) {
+ if( *p < 0x20 || (*p >= 0x7f && *p < 0xa0) || *p == delim ||
+ (delim && *p=='\\')) {
if( *p=='\n' || *p=='\r' || *p=='\f'
|| *p=='\v' || *p=='\b' || !*p )
buflen += 2;
@@ -243,9 +261,10 @@ make_printable_string( const byte *p, size_t n, int delim )
p = save_p;
n = save_n;
/* and now make the string */
- d = buffer = gcry_xmalloc( buflen );
+ d = buffer = m_alloc( buflen );
for( ; n; n--, p++ ) {
- if( iscntrl( *p ) || *p == delim ) {
+ if( *p < 0x20 || (*p >= 0x7f && *p < 0xa0) || *p == delim ||
+ (delim && *p=='\\')) {
*d++ = '\\';
if( *p == '\n' )
*d++ = 'n';
@@ -271,32 +290,37 @@ make_printable_string( const byte *p, size_t n, int delim )
return buffer;
}
-
int
-answer_is_yes( const char *s )
+answer_is_yes_no_default( const char *s, int def_answer )
{
- char *long_yes = _("yes");
- char *short_yes = _("yY");
- char *long_no = _("no");
- char *short_no = _("nN");
+ const char *long_yes = _("yes");
+ const char *short_yes = _("yY");
+ const char *long_no = _("no");
+ const char *short_no = _("nN");
- if( !stricmp(s, long_yes ) )
+ /* Note: we have to use the local dependent strcasecmp here */
+ if( !strcasecmp(s, long_yes ) )
return 1;
- if( strchr( short_yes, *s ) && !s[1] )
+ if( *s && strchr( short_yes, *s ) && !s[1] )
return 1;
/* test for no strings to catch ambiguities for the next test */
- if( !stricmp(s, long_no ) )
+ if( !strcasecmp(s, long_no ) )
return 0;
- if( strchr( short_no, *s ) && !s[1] )
+ if( *s && strchr( short_no, *s ) && !s[1] )
return 0;
/* test for the english version (for those who are used to type yes) */
- if( !stricmp(s, "yes" ) )
+ if( !ascii_strcasecmp(s, "yes" ) )
return 1;
- if( strchr( "yY", *s ) && !s[1] )
+ if( *s && strchr( "yY", *s ) && !s[1] )
return 1;
- return 0;
+ return def_answer;
}
+int
+answer_is_yes( const char *s )
+{
+ return answer_is_yes_no_default(s,0);
+}
/****************
* Return 1 for yes, -1 for quit, or 0 for no
@@ -304,34 +328,34 @@ answer_is_yes( const char *s )
int
answer_is_yes_no_quit( const char *s )
{
- char *long_yes = _("yes");
- char *long_no = _("no");
- char *long_quit = _("quit");
- char *short_yes = _("yY");
- char *short_no = _("nN");
- char *short_quit = _("qQ");
+ const char *long_yes = _("yes");
+ const char *long_no = _("no");
+ const char *long_quit = _("quit");
+ const char *short_yes = _("yY");
+ const char *short_no = _("nN");
+ const char *short_quit = _("qQ");
- if( !stricmp(s, long_no ) )
+ /* Note: We have to use the locale dependent strcasecmp */
+ if( !strcasecmp(s, long_no ) )
return 0;
- if( !stricmp(s, long_yes ) )
+ if( !strcasecmp(s, long_yes ) )
return 1;
- if( !stricmp(s, long_quit ) )
+ if( !strcasecmp(s, long_quit ) )
return -1;
- if( strchr( short_no, *s ) && !s[1] )
+ if( *s && strchr( short_no, *s ) && !s[1] )
return 0;
- if( strchr( short_yes, *s ) && !s[1] )
+ if( *s && strchr( short_yes, *s ) && !s[1] )
return 1;
- if( strchr( short_quit, *s ) && !s[1] )
+ if( *s && strchr( short_quit, *s ) && !s[1] )
return -1;
- if( !stricmp(s, "yes" ) )
+ /* but not here */
+ if( !ascii_strcasecmp(s, "yes" ) )
return 1;
- if( !stricmp(s, "quit" ) )
+ if( !ascii_strcasecmp(s, "quit" ) )
return -1;
- if( strchr( "yY", *s ) && !s[1] )
+ if( *s && strchr( "yY", *s ) && !s[1] )
return 1;
- if( strchr( "qQ", *s ) && !s[1] )
+ if( *s && strchr( "qQ", *s ) && !s[1] )
return -1;
return 0;
}
-
-