1 /* utils.c --- Auxilliary help functions.
2  * Copyright (C) 2002-2013 Simon Josefsson
3  *
4  * This file is part of Shishi.
5  *
6  * Shishi is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * Shishi is distributed in the hope that it will be useful, but
12  * 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 Shishi; if not, see http://www.gnu.org/licenses or write
18  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
19  * Floor, Boston, MA 02110-1301, USA
20  *
21  */
22 
23 #include "internal.h"
24 
25 /* Get prototypes. */
26 #include "utils.h"
27 
28 void
_shishi_escapeprint(const char * str,int len)29 _shishi_escapeprint (const char *str, int len)
30 {
31   int i;
32 
33   printf ("\t ;; `");
34   for (i = 0; i < len; i++)
35     if ((str[i] >= 'A' && str[i] <= 'Z') ||
36 	(str[i] >= 'a' && str[i] <= 'z') ||
37 	(str[i] >= '0' && str[i] <= '9') || str[i] == '.')
38       printf ("%c", str[i] & 0xFF);
39     else
40       printf ("\\x%02x", str[i] & 0xFF);
41   printf ("' (length %d bytes)\n", len);
42 }
43 
44 void
_shishi_hexprint(const char * str,int len)45 _shishi_hexprint (const char *str, int len)
46 {
47   int i;
48 
49   printf ("\t ;; ");
50   for (i = 0; i < len; i++)
51     {
52       printf ("%02x ", str[i] & 0xFF);
53       if ((i + 1) % 8 == 0)
54 	printf (" ");
55       if ((i + 1) % 16 == 0 && i + 1 < len)
56 	printf ("\n\t ;; ");
57     }
58   puts ("");
59 }
60 
61 void
_shishi_binprint(const char * str,int len)62 _shishi_binprint (const char *str, int len)
63 {
64   int i;
65 
66   printf ("\t ;; ");
67   for (i = 0; i < len; i++)
68     {
69       printf ("%d%d%d%d%d%d%d%d ",
70 	      str[i] & 0x80 ? 1 : 0,
71 	      str[i] & 0x40 ? 1 : 0,
72 	      str[i] & 0x20 ? 1 : 0,
73 	      str[i] & 0x10 ? 1 : 0,
74 	      str[i] & 0x08 ? 1 : 0,
75 	      str[i] & 0x04 ? 1 : 0,
76 	      str[i] & 0x02 ? 1 : 0, str[i] & 0x01 ? 1 : 0);
77       if ((i + 1) % 3 == 0)
78 	printf (" ");
79       if ((i + 1) % 6 == 0 && i + 1 < len)
80 	printf ("\n\t ;; ");
81     }
82   puts ("");
83 }
84 
85 void
_shishi_bin7print(const char * str,int len)86 _shishi_bin7print (const char *str, int len)
87 {
88   int i;
89 
90   printf ("\t ;; ");
91   for (i = 0; i < len; i++)
92     {
93       printf ("%d%d%d%d%d%d%d ",
94 	      str[i] & 0x40 ? 1 : 0,
95 	      str[i] & 0x20 ? 1 : 0,
96 	      str[i] & 0x10 ? 1 : 0,
97 	      str[i] & 0x08 ? 1 : 0,
98 	      str[i] & 0x04 ? 1 : 0,
99 	      str[i] & 0x02 ? 1 : 0, str[i] & 0x01 ? 1 : 0);
100       if ((i + 1) % 3 == 0)
101 	printf (" ");
102       if ((i + 1) % 6 == 0 && i + 1 < len)
103 	printf ("\n\t ;; ");
104     }
105   puts ("");
106 }
107 
108 time_t
xtime(time_t * t)109 xtime (time_t * t)
110 {
111   time_t now;
112 
113   now = time (t);
114   if (now == (time_t) - 1)
115     {
116       perror ("time");
117       abort ();
118     }
119 
120   return now;
121 }
122 
123 time_t
shishi_get_date(const char * p,const time_t * now)124 shishi_get_date (const char *p, const time_t * now)
125 {
126   struct timespec nowspec = { 0, 0 };
127   struct timespec thenspec;
128 
129   if (now)
130     nowspec.tv_sec = *now;
131   else
132     nowspec.tv_sec = time (NULL);
133 
134   if (!parse_datetime (&thenspec, p, &nowspec))
135     {
136       thenspec.tv_sec = (time_t) - 1;
137       thenspec.tv_nsec = 0;
138     }
139 
140   return thenspec.tv_sec;
141 }
142 
143 /* If non-NULL, call this function when memory is exhausted. */
144 void (*shishi_alloc_fail_function) (void) = 0;
145 
146 void
shishi_xalloc_die(void)147 shishi_xalloc_die (void)
148 {
149   if (shishi_alloc_fail_function)
150     (*shishi_alloc_fail_function) ();
151   fflush (stdout);
152   fprintf (stderr, _("%s: Memory allocation failed\n"), PACKAGE);
153   abort ();
154 }
155