slang-data.c revision 46bd0121f3cec6b80bd90a04a43604293f0d822b
146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao#include <stdio.h> 246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao#include <stdlib.h> 346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao#include <string.h> 446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liaoint main(int argc, char *argv[]) { 646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao // Arguments 746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao if (argc != 4 || (argc == 2 && strcmp(argv[1], "--help") == 0)) { 846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fprintf(stderr, "Usage: %s PREFIX OUTFILE INFILE\n", argv[0]); 946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao exit(EXIT_FAILURE); 1046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao } 1146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 1246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao char const *prefix = argv[1]; 1346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao char const *infile_name = argv[3]; 1446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao char const *outfile_name = argv[2]; 1546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 1646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao // Open Files 1746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao FILE *infile = fopen(infile_name, "rb"); 1846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 1946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao if (!infile) { 2046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fprintf(stderr, "Unable to open input file: %s\n", infile_name); 2146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao exit(EXIT_FAILURE); 2246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao } 2346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 2446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao FILE *outfile = fopen(outfile_name, "w"); 2546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 2646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao if (!outfile) { 2746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fprintf(stderr, "Uanble to open output file: %s\n", outfile_name); 2846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fclose(infile); 2946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao exit(EXIT_FAILURE); 3046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao } 3146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 3246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 3346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao // Generate Header Guard Begin 3446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fprintf(outfile, "#ifndef %s_data_pack_h\n", prefix); 3546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fprintf(outfile, "#define %s_data_pack_h\n\n", prefix); 3646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 3746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 3846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao // Generate Include Directive 3946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fprintf(outfile, "#include <stddef.h>\n\n"); 4046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 4146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 4246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao // Generate Encoded Data 4346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fprintf(outfile, "static const char %s_data[] =\n", prefix); 4446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 4546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao size_t data_size = 0; 4646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao for (;;) { 4746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao unsigned char buf[256]; 4846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao unsigned char *ptr = buf; 4946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 5046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao size_t nread = fread(buf, sizeof(char), sizeof(buf), infile); 5146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao size_t line_count = nread / 16; 5246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao size_t i; 5346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 5446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao data_size += nread; 5546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 5646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao for (i = 0; i < line_count; ++i, ptr += 16) { 5746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fprintf(outfile, 5846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao "\"" 5946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao "\\x%02x\\x%02x\\x%02x\\x%02x" 6046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao "\\x%02x\\x%02x\\x%02x\\x%02x" 6146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao "\\x%02x\\x%02x\\x%02x\\x%02x" 6246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao "\\x%02x\\x%02x\\x%02x\\x%02x" 6346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao "\"\n", 6446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao ptr[0], ptr[1], ptr[2], ptr[3], 6546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao ptr[4], ptr[5], ptr[6], ptr[7], 6646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao ptr[8], ptr[9], ptr[10], ptr[11], 6746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao ptr[12], ptr[13], ptr[14], ptr[15]); 6846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao } 6946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 7046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao if (nread % 16 != 0) { 7146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fprintf(outfile, "\""); 7246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 7346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao for (i = line_count * 16; i < nread; ++i) { 7446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fprintf(outfile, "\\x%02x", buf[i]); 7546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao } 7646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 7746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fprintf(outfile, "\"\n"); 7846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao } 7946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 8046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao if (nread != sizeof(buf)) { 8146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao // End of file reached 8246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao break; 8346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao } 8446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao } 8546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 8646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fprintf(outfile, ";\n\n"); 8746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 8846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 8946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao // Generate Data Size 9046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fprintf(outfile, "static const size_t %s_size = %lu;\n", 9146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao prefix, (unsigned long)data_size); 9246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 9346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 9446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao // Generate Header Guard End 9546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fprintf(outfile, "\n#endif\n"); 9646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 9746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 9846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao // Close Files 9946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fclose(infile); 10046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao fclose(outfile); 10146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao 10246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao return EXIT_SUCCESS; 10346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao} 104