| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  * as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  |  * of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  * along with this program; if not, write to the Free Software Foundation, | 
					
						
							|  |  |  |  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 08:08:12 +11:00
										 |  |  | /** \file
 | 
					
						
							|  |  |  |  * \ingroup datatoc | 
					
						
							| 
									
										
										
										
											2013-09-12 03:02:50 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							| 
									
										
										
										
											2020-03-19 09:33:03 +01:00
										 |  |  | #include <string.h>
 | 
					
						
							| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* #define VERBOSE */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | #define MAX2(x, y) ((x) > (y) ? (x) : (y))
 | 
					
						
							|  |  |  | #define MAX3(x, y, z) MAX2(MAX2((x), (y)), (z))
 | 
					
						
							| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static char *basename(char *string) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   char *lfslash, *lbslash; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   lfslash = strrchr(string, '/'); | 
					
						
							|  |  |  |   lbslash = strrchr(string, '\\'); | 
					
						
							|  |  |  |   if (lbslash) { | 
					
						
							|  |  |  |     lbslash++; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (lfslash) { | 
					
						
							|  |  |  |     lfslash++; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return MAX3(string, lfslash, lbslash); | 
					
						
							| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int main(int argc, char **argv) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   FILE *fpin, *fpout; | 
					
						
							|  |  |  |   long size; | 
					
						
							|  |  |  |   int i; | 
					
						
							|  |  |  |   int argv_len; | 
					
						
							| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   if (argc < 2) { | 
					
						
							|  |  |  |     printf("Usage: datatoc <data_file_from> <data_file_to>\n"); | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   fpin = fopen(argv[1], "rb"); | 
					
						
							|  |  |  |   if (!fpin) { | 
					
						
							|  |  |  |     printf("Unable to open input <%s>\n", argv[1]); | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   argv[1] = basename(argv[1]); | 
					
						
							| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   fseek(fpin, 0L, SEEK_END); | 
					
						
							|  |  |  |   size = ftell(fpin); | 
					
						
							|  |  |  |   fseek(fpin, 0L, SEEK_SET); | 
					
						
							| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   if (argv[1][0] == '.') { | 
					
						
							|  |  |  |     argv[1]++; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef VERBOSE
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   printf("Making C file <%s>\n", argv[2]); | 
					
						
							| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   argv_len = (int)strlen(argv[1]); | 
					
						
							|  |  |  |   for (i = 0; i < argv_len; i++) { | 
					
						
							| 
									
										
										
										
											2019-04-22 12:20:14 +10:00
										 |  |  |     if (argv[1][i] == '.') { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |       argv[1][i] = '_'; | 
					
						
							| 
									
										
										
										
											2019-04-22 12:20:14 +10:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   fpout = fopen(argv[2], "w"); | 
					
						
							|  |  |  |   if (!fpout) { | 
					
						
							|  |  |  |     fprintf(stderr, "Unable to open output <%s>\n", argv[2]); | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   fprintf(fpout, "/* DataToC output of file <%s> */\n\n", argv[1]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* Quiet 'missing-variable-declarations' warning. */ | 
					
						
							| 
									
										
										
										
											2019-08-04 14:24:29 -06:00
										 |  |  |   fprintf(fpout, "extern const int datatoc_%s_size;\n", argv[1]); | 
					
						
							|  |  |  |   fprintf(fpout, "extern const char datatoc_%s[];\n\n", argv[1]); | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-04 14:24:29 -06:00
										 |  |  |   fprintf(fpout, "const int datatoc_%s_size = %d;\n", argv[1], (int)size); | 
					
						
							|  |  |  |   fprintf(fpout, "const char datatoc_%s[] = {\n", argv[1]); | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   while (size--) { | 
					
						
							|  |  |  |     /* if we want to open in an editor
 | 
					
						
							|  |  |  |      * this is nicer to avoid very long lines */ | 
					
						
							| 
									
										
										
										
											2012-08-11 18:39:38 +00:00
										 |  |  | #ifdef VERBOSE
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |     if (size % 32 == 31) { | 
					
						
							|  |  |  |       fprintf(fpout, "\n"); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-08-11 18:39:38 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |     /* fprintf (fpout, "\\x%02x", getc(fpin)); */ | 
					
						
							|  |  |  |     fprintf(fpout, "%3d,", getc(fpin)); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-18 09:35:12 +11:00
										 |  |  |   /* Trailing NULL terminator, this isn't needed in some cases and
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |    * won't be taken into account by the size variable, but its useful when dealing with | 
					
						
							|  |  |  |    * NULL terminated string data */ | 
					
						
							|  |  |  |   fprintf(fpout, "0\n};\n\n"); | 
					
						
							| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   fclose(fpin); | 
					
						
							|  |  |  |   fclose(fpout); | 
					
						
							|  |  |  |   return 0; | 
					
						
							| 
									
										
										
										
											2012-08-11 16:25:31 +00:00
										 |  |  | } |