FreeCalypso > hg > freecalypso-reveng
comparison fluid-mnf/misc.c @ 311:9cecc930d78f
fluid-mnf: original source from TI,
defenestrated line endings and rearranged directory structure,
but no *.[ch] source file content changes yet
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 29 Feb 2020 05:36:07 +0000 |
parents | |
children | 1cd24530c0ae |
comparison
equal
deleted
inserted
replaced
310:ae39d76d5b7a | 311:9cecc930d78f |
---|---|
1 /****************************************************************************** | |
2 * FLUID (Flash Loader Utility Independent of Device) | |
3 * | |
4 * Copyright Texas Instruments, 2001. | |
5 * Mads Meisner-Jensen, mmj@ti.com. | |
6 * | |
7 * Miscellaneous Utility Functions | |
8 * | |
9 * $Id: misc.c 1.14 Fri, 11 Oct 2002 08:40:21 +0200 mmj $ | |
10 * | |
11 ******************************************************************************/ | |
12 | |
13 #include "misc.h" | |
14 #include "fluid.h" | |
15 #include "trace.h" | |
16 | |
17 #include <stdio.h> | |
18 #include <time.h> | |
19 | |
20 #if defined(MSC) || defined(BCC) | |
21 #include "windows.h" | |
22 #endif | |
23 | |
24 | |
25 /****************************************************************************** | |
26 * File And Path Name Functions | |
27 ******************************************************************************/ | |
28 | |
29 // Return the length of the directory name preceding the leafname. The | |
30 // terminating slash is included in the length. Length can be zero, if there | |
31 // is no dirname. | |
32 int dirname_len(const char *pathname) | |
33 { | |
34 char *p; | |
35 int len; | |
36 | |
37 tr(TrUtility, "dirname_len('%s')\n", pathname); | |
38 | |
39 if ((len = strlen(pathname)) == 0) | |
40 return 0; | |
41 | |
42 p = (char *) (pathname + len - 1); | |
43 | |
44 tr(TrUtility, "{ %d }\n", len); | |
45 | |
46 while (*p != '/' && *p != '\\' && len-- > 1) | |
47 p--; | |
48 | |
49 return len; | |
50 } | |
51 | |
52 // Construct a full pathname from <dirname> and <leafname>. The full | |
53 // pathname is copied in the buffer <buf> of size <size>. On success, the | |
54 // full length of the pathname is returned. Otherwise, if the buffer is too | |
55 // small, -1 is returned. NOTE: The <dirname> is supposed to end with a | |
56 // slash. If not, the leafname part (if present) of the <dirname> will be | |
57 // removed. | |
58 int pathname_make(char *buf, int size, const char *dirname, const char *leafname) | |
59 { | |
60 int dir_len, leaf_len, result; | |
61 | |
62 tr(TrBegin|TrUtility, "pathname_make(*, %d, '%s', '%s') {\n", | |
63 size, dirname, leafname); | |
64 | |
65 dir_len = dirname_len(dirname); | |
66 leaf_len = strlen(leafname); | |
67 | |
68 if (dir_len > size - leaf_len - 1) | |
69 result = E_BUFFER; | |
70 else { | |
71 memcpy(buf, dirname, dir_len); | |
72 strcpy(buf + dir_len, leafname); | |
73 result = dir_len + leaf_len; | |
74 } | |
75 | |
76 tr(TrEnd|TrUtility, "} %d\n", result); | |
77 | |
78 return result; | |
79 } | |
80 | |
81 | |
82 /****************************************************************************** | |
83 * Utility Funcions | |
84 ******************************************************************************/ | |
85 | |
86 // Return the base 2 logarithm of <number>. Return -1 if <number> is zero. | |
87 unsigned int log2(unsigned int number) | |
88 { | |
89 int result = -1; | |
90 | |
91 while (number > 0) { | |
92 number >>= 1; | |
93 result++; | |
94 } | |
95 return result; | |
96 } | |
97 | |
98 | |
99 /****************************************************************************** | |
100 * Progress and Timer Functions | |
101 ******************************************************************************/ | |
102 | |
103 static int progress_mul; | |
104 static int progress_index; | |
105 static char progress_string[35] = "(---------------------------------)"; | |
106 static char progress_backup[33] = | |
107 "\b\b\b\b\b\b\b\b" "\b\b\b\b\b\b\b\b" "\b\b\b\b\b\b\b\b" "\b\b\b\b\b\b\b\b"; | |
108 | |
109 void progress_begin(int n) | |
110 { | |
111 tr(TrUtility, "progress_begin(%d)\n", n); | |
112 | |
113 progress_index = 0; | |
114 | |
115 switch (arg_progress) { | |
116 case 'a': | |
117 // We select a progress multiplier that is a power of two. Then we | |
118 // generate a progress indicator that is in the range [16..32[ chars | |
119 // in length. | |
120 progress_mul = n / 32; | |
121 progress_mul = 1 << (log2(progress_mul) + 1); | |
122 n = (n + progress_mul - 1) / progress_mul; | |
123 | |
124 progress_string[1 + n] = ')'; | |
125 progress_string[1 + n + 1] = 0; | |
126 | |
127 flowf(NORMAL, "%s\b%s", | |
128 progress_string, &progress_backup[32 - n]); | |
129 break; | |
130 case 'c': | |
131 break; | |
132 case 'd': | |
133 break; | |
134 } | |
135 } | |
136 | |
137 void progress_update_simple(int n) | |
138 { | |
139 tr(TrUtility, "progress_update_simple(%d)\n", n); | |
140 | |
141 switch (arg_progress) { | |
142 case 'c': | |
143 flowf(NORMAL, "%c", n); | |
144 break; | |
145 } | |
146 } | |
147 | |
148 void progress_update(int n) | |
149 { | |
150 char ch; | |
151 | |
152 tr(TrUtility, "progress_update(%d)\n", n); | |
153 | |
154 switch (arg_progress) { | |
155 case 'a': | |
156 if (n / progress_mul > progress_index) { | |
157 progress_index++; | |
158 flowf(NORMAL, "*"); | |
159 } | |
160 | |
161 n = n % progress_mul; | |
162 ch = n + (n <= 9 ? '0' : 'A' - 10); | |
163 flowf(NORMAL, "%c\b", ch); | |
164 break; | |
165 case 'c': | |
166 break; | |
167 case 'd': | |
168 flowf(NORMAL, "."); | |
169 break; | |
170 } | |
171 } | |
172 | |
173 void progress_end(int n) | |
174 { | |
175 switch (arg_progress) { | |
176 case 'a': | |
177 if (n % progress_mul) | |
178 flowf(NORMAL, "*) "); | |
179 else | |
180 flowf(NORMAL, ") "); | |
181 break; | |
182 case 'c': | |
183 case 'd': | |
184 flowf(NORMAL, " "); | |
185 break; | |
186 } | |
187 } | |
188 | |
189 int stopwatch_start(void) | |
190 { | |
191 #if defined(MSC) || defined(BCC) | |
192 return GetTickCount(); | |
193 #else | |
194 return 1000 * time(NULL); | |
195 #endif | |
196 } | |
197 | |
198 int stopwatch_stop(int time_start) | |
199 { | |
200 #if defined(MSC) || defined(BCC) | |
201 return GetTickCount() - time_start; | |
202 #else | |
203 return 1000 * (time(NULL) - time_start); | |
204 #endif | |
205 } | |
206 | |
207 | |
208 /****************************************************************************** | |
209 * Hexdumping | |
210 ******************************************************************************/ | |
211 | |
212 void hexdump(unsigned char *buf, int size, unsigned int addr, int unitsize) | |
213 { | |
214 int n, i; | |
215 char string[(8+1+1) + (1+16+1+1) + (3*16) + 1]; | |
216 char *s; | |
217 | |
218 while (size > 0) | |
219 { | |
220 s = string; | |
221 s += sprintf(s, "%8x ", addr); // print offset | |
222 | |
223 n = (size > 16 ? 16 : size); | |
224 | |
225 // print the textual representation | |
226 for (i = 0; i < n; i++) { | |
227 if (buf[i] >= ' ' && buf[i] < 127) | |
228 *s++ = buf[i]; | |
229 else | |
230 *s++ = '.'; | |
231 } | |
232 // pad textual representation with spaces | |
233 for (i = 0; i < 16 - n; i++) { | |
234 *s++ = ' '; | |
235 } | |
236 *s++ = ' '; | |
237 | |
238 // print hexedecimal representation | |
239 for (i = 0; i < n; i += unitsize) { | |
240 switch (unitsize) { | |
241 case 1: s += sprintf(s, "%02x ", *(uint8 *) (buf+i)); break; | |
242 case 2: s += sprintf(s, "%04x ", *(uint16 *) (buf+i)); break; | |
243 case 4: | |
244 s += sprintf(s, "%08x ", (int) (*(uint32 *) (buf+i))); | |
245 break; | |
246 } | |
247 } | |
248 buf += 16; | |
249 addr += 16; | |
250 size -= 16; | |
251 puts(string); | |
252 } | |
253 } |