• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (C) 2007-2008 The Android Open Source Project
2 **
3 ** This software is licensed under the terms of the GNU General Public
4 ** License version 2, as published by the Free Software Foundation, and
5 ** may be copied, distributed, and modified under those terms.
6 **
7 ** This program is distributed in the hope that it will be useful,
8 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
9 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10 ** GNU General Public License for more details.
11 */
12 
13 #include "android/utils/misc.h"
14 #include "android/utils/stralloc.h"
15 #include "android/utils/debug.h"
16 #include <string.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 
20 extern void
print_tabular(const char ** strings,int count,const char * prefix,int width)21 print_tabular( const char** strings, int  count,
22                const char*  prefix,  int  width )
23 {
24     int  nrows, ncols, r, c, n, maxw = 0;
25 
26     for (n = 0; n < count; n++) {
27         int  len = strlen(strings[n]);
28         if (len > maxw)
29             maxw = len;
30     }
31     maxw += 2;
32     ncols = width/maxw;
33     nrows = (count + ncols-1)/ncols;
34 
35     for (r = 0; r < nrows; r++) {
36         printf( "%s", prefix );
37         for (c = 0; c < ncols; c++) {
38             int  index = c*nrows + r;
39             if (index >= count) {
40                 break;
41             }
42             printf( "%-*s", maxw, strings[index] );
43         }
44         printf( "\n" );
45     }
46 }
47 
48 extern void
string_translate_char(char * str,char from,char to)49 string_translate_char( char*  str, char from, char to )
50 {
51     char*  p = str;
52     while (p != NULL && (p = strchr(p, from)) != NULL)
53         *p++ = to;
54 }
55 
56 extern void
buffer_translate_char(char * buff,unsigned buffLen,const char * src,char fromChar,char toChar)57 buffer_translate_char( char*        buff,
58                        unsigned     buffLen,
59                        const char*  src,
60                        char         fromChar,
61                        char         toChar )
62 {
63     int    len = strlen(src);
64 
65     if (len >= buffLen)
66         len = buffLen-1;
67 
68     memcpy(buff, src, len);
69     buff[len] = 0;
70 
71     string_translate_char( buff, fromChar, toChar );
72 }
73 
74 
75 /** TEMP CHAR STRINGS
76  **
77  ** implement a circular ring of temporary string buffers
78  **/
79 
80 typedef struct Temptring {
81     struct TempString*  next;
82     char*               buffer;
83     int                 size;
84 } TempString;
85 
86 #define  MAX_TEMP_STRINGS   16
87 
88 static TempString  _temp_strings[ MAX_TEMP_STRINGS ];
89 static int         _temp_string_n;
90 
91 extern char*
tempstr_get(int size)92 tempstr_get( int  size )
93 {
94     TempString*  t = &_temp_strings[_temp_string_n];
95 
96     if ( ++_temp_string_n >= MAX_TEMP_STRINGS )
97         _temp_string_n = 0;
98 
99     size += 1;  /* reserve 1 char for terminating zero */
100 
101     if (t->size < size) {
102         t->buffer = realloc( t->buffer, size );
103         if (t->buffer == NULL) {
104             derror( "%s: could not allocate %d bytes",
105                     __FUNCTION__, size );
106             exit(1);
107         }
108         t->size   = size;
109     }
110     return  t->buffer;
111 }
112 
113 extern char*
tempstr_format(const char * fmt,...)114 tempstr_format( const char*  fmt, ... )
115 {
116     va_list  args;
117     char*    result;
118     STRALLOC_DEFINE(s);
119     va_start(args, fmt);
120     stralloc_formatv(s, fmt, args);
121     va_end(args);
122     result = stralloc_to_tempstr(s);
123     stralloc_reset(s);
124     return result;
125 }
126 
127 /** QUOTING
128  **
129  ** dumps a human-readable version of a string. this replaces
130  ** newlines with \n, etc...
131  **/
132 
133 extern const char*
quote_bytes(const char * str,int len)134 quote_bytes( const char*  str, int  len )
135 {
136     STRALLOC_DEFINE(s);
137     char*  q;
138 
139     stralloc_add_quote_bytes( s, str, len );
140     q = stralloc_to_tempstr( s );
141     stralloc_reset(s);
142     return q;
143 }
144 
145 extern const char*
quote_str(const char * str)146 quote_str( const char*  str )
147 {
148     int  len = strlen(str);
149     return quote_bytes( str, len );
150 }
151 
152 /** HEXADECIMAL CHARACTER SEQUENCES
153  **/
154 
155 static int
hexdigit(int c)156 hexdigit( int  c )
157 {
158     unsigned  d;
159 
160     d = (unsigned)(c - '0');
161     if (d < 10) return d;
162 
163     d = (unsigned)(c - 'a');
164     if (d < 6) return d+10;
165 
166     d = (unsigned)(c - 'A');
167     if (d < 6) return d+10;
168 
169     return -1;
170 }
171 
172 int
hex2int(const uint8_t * hex,int len)173 hex2int( const uint8_t*  hex, int  len )
174 {
175     int  result = 0;
176     while (len > 0) {
177         int  c = hexdigit(*hex++);
178         if (c < 0)
179             return -1;
180 
181         result = (result << 4) | c;
182         len --;
183     }
184     return result;
185 }
186 
187 void
int2hex(uint8_t * hex,int len,int val)188 int2hex( uint8_t*  hex, int  len, int  val )
189 {
190     static const uint8_t  hexchars[16] = "0123456789abcdef";
191     while ( --len >= 0 )
192         *hex++ = hexchars[(val >> (len*4)) & 15];
193 }
194