diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2020-08-22 14:05:41 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2020-08-22 14:05:41 +0200 |
commit | b55285a77da0e0b829e4ce8d7e09debaabc68e15 (patch) | |
tree | f622559ef65bbdd3e1c5bdb06098a8f89eec0563 /app/help/genhelp.c | |
parent | d3897ce090dbeb220ed2c782f095597e417cf3cc (diff) | |
parent | d1ae75703e1ed81d65ea16946dcdb77e7a13adc9 (diff) |
Merge branch 'feature/upstream' into develop
Diffstat (limited to 'app/help/genhelp.c')
-rw-r--r-- | app/help/genhelp.c | 286 |
1 files changed, 106 insertions, 180 deletions
diff --git a/app/help/genhelp.c b/app/help/genhelp.c index 7f79330..be20ff4 100644 --- a/app/help/genhelp.c +++ b/app/help/genhelp.c @@ -1,6 +1,6 @@ /* XTrkCad - Model Railroad CAD - * Copyright (C) 2005 Dave Bullis + * Copyright (C) 2018 Martin Fischer * * 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 @@ -16,197 +16,123 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -//#ifdef WINDOWS -#include <stdlib.h> -//#endif +#include <stdlib.h> #include <stdio.h> #include <string.h> +#include "cJSON.h" #define I18NHEADERFILE "i18n.h" -typedef enum { MSWPOPUP, XVINFO, BALLOONHELP, HPJALIAS, ALIASREF, ALIASDEF, DEFINE, BALLOONHELPI18N } mode_e; +typedef enum { BALLOONHELP, BALLOONHELPI18N } mode_e; -void remap_minus( char * cp ) +int process(mode_e mode, char * json, FILE * outFile) { - for ( ; *cp; cp++ ) - if ( *cp == '-' ) - *cp = '_'; -} + const cJSON *messages = NULL; + const cJSON *messageLine = NULL; + int status = 0; -void process( mode_e mode, FILE * inFile, FILE * outFile ) -{ - char line[256]; - char * cp; - char * contents; - char * alias; - char * extHelp; - int lineNum; - int len; - - switch ( mode ) { - case MSWPOPUP: - break; - case XVINFO: - break; - case BALLOONHELP: - case BALLOONHELPI18N: - fputs( "/*\n * DO NOT EDIT! This file has been automatically created by genhelp.\n * Changes to this file will be overwritten.\n */\n", outFile ); - fprintf( outFile, "#include <stdio.h>\n" ); - fprintf( outFile, "#include \"wlib.h\"\n" ); - if( mode == BALLOONHELPI18N ) - fprintf( outFile, "#include \"" I18NHEADERFILE "\"\n" ); - - fprintf( outFile, "wBalloonHelp_t balloonHelp[] = {\n\n" ); - break; - case HPJALIAS: - fprintf( outFile, "[ALIAS]\r\n" ); - break; - case ALIASREF: - break; - case ALIASDEF: - break; - case DEFINE: - break; - } - - lineNum = 0; - while ( fgets( line, sizeof line, inFile ) != NULL ) { - lineNum++; - if (line[0] == '#') - continue; - len = (int)strlen( line ); - if (line[len-1] == '\n' ) len--; - if (line[len-1] == '\r' ) len--; - line[len] = '\0'; - if (len == 0) - continue; - contents = strchr( line, '\t' ); - if (contents == NULL) { - fprintf( stderr, "Not tab on line %d\n%s\n", lineNum, line ); - continue; - } - *contents++ = '\0'; - alias = strchr( contents, '\t' ); - if (alias != NULL) { - *alias++ = '\0'; - extHelp = strchr( alias, '\t' ); - if (extHelp != NULL) { - *extHelp++ = '\0'; - } - } - switch ( mode ) { - case MSWPOPUP: - remap_minus( line ); - remap_minus( contents ); - fprintf( outFile, "\\page #{\\footnote _%s}\r\n", line ); - for ( cp=contents; *cp; cp++ ) { - if ( (*cp) & 0x80 ) { - fprintf( outFile, "\\'%2.2X", (unsigned char)*cp ); - } else { - fprintf( outFile, "%c", *cp ); - } - } - fprintf( outFile, "\r\n" ); - break; - case XVINFO: - if ( *contents ) - fprintf( outFile, ":%s\n%s\n", line, contents ); - break; - case BALLOONHELP: - case BALLOONHELPI18N: - if ( *contents ) - if( mode == BALLOONHELP ) - fprintf( outFile, "\t{ \"%s\", \"%s\" },\n", line, contents ); - else - fprintf( outFile, "\t{ \"%s\", N_(\"%s\") },\n", line, contents ); - else - fprintf( outFile, "\t{ \"%s\" },\n", line ); - break; - case HPJALIAS: - if (alias && *alias) { - remap_minus( line ); - remap_minus( alias ); - fprintf( outFile, "%s=%s\r\n", line, alias ); - } - break; - case ALIASREF: - if (alias && *alias) - fprintf( outFile, "%s\n", alias ); - break; - case ALIASDEF: - if (alias && *alias) - fprintf( outFile, "%s\n", line ); - break; - case DEFINE: - fprintf( outFile, "%s\n", line ); - break; - } - } - - switch ( mode ) { - case MSWPOPUP: - break; - case XVINFO: - fprintf( outFile, ":\n" ); - break; - case BALLOONHELP: - case BALLOONHELPI18N: - fprintf( outFile, "\n { NULL, NULL } };\n" ); - break; - case HPJALIAS: - break; - case ALIASREF: - break; - case ALIASDEF: - break; - case DEFINE: - break; - } + cJSON *message_json = cJSON_Parse(json); + if (message_json == NULL) { + const char *error_ptr = cJSON_GetErrorPtr(); + if (error_ptr != NULL) { + fprintf(stderr, "Error before: %s\n", error_ptr); + } + status = 0; + goto end; + } + + fputs("/*\n * DO NOT EDIT! This file has been automatically created by genhelp.\n * Changes to this file will be overwritten.\n */\n", + outFile); + fprintf(outFile, "#include <stdio.h>\n"); + fprintf(outFile, "#include \"wlib.h\"\n"); + if (mode == BALLOONHELPI18N) { + fprintf(outFile, "#include \"" I18NHEADERFILE "\"\n"); + } + + fprintf(outFile, "wBalloonHelp_t balloonHelp[] = {\n"); + + + messages = cJSON_GetObjectItemCaseSensitive(message_json, "messages"); + cJSON_ArrayForEach(messageLine, messages) { + cJSON *line = cJSON_GetObjectItemCaseSensitive(messageLine, "line"); + cJSON *contents = cJSON_GetObjectItemCaseSensitive(messageLine, "contents"); + if (!cJSON_IsString(line) || !cJSON_IsString(contents)) { + status = 0; + goto end; + } + + if (contents->valuestring != NULL) { + if (mode == BALLOONHELP) { + fprintf(outFile, "\t{ \"%s\", \"%s\" },\n", line->valuestring, + contents->valuestring); + } else { + if (contents->valuestring[0]) { + fprintf(outFile, "\t{ \"%s\", N_(\"%s\") },\n", line->valuestring, + contents->valuestring); + } else { + fprintf(outFile, "\t{ \"%s\", \"\" },\n", line->valuestring); + } + } + } else { + fprintf(outFile, "\t{ \"%s\", \"No help\" },\n", line->valuestring); + fprintf(stderr, "INFO: %s has an empty help text\n", line->valuestring); + } + } + + fprintf(outFile, "\t{ NULL, NULL } };\n"); +end: + cJSON_Delete(message_json); + return status; } -int main ( int argc, char * argv[] ) +int main(int argc, char * argv[]) { - FILE * inFile, * outFile; - mode_e mode; - if ( argc != 4 ) { - fprintf( stderr, "Usage: %s (-msw|-xv|-bh|-hpj|-ref) INFILE OUTFILE\n", argv[0] ); - exit(1); - } - if ( strcmp( argv[1], "-msw" ) == 0 ) - mode = MSWPOPUP; - else if ( strcmp( argv[1], "-xv" ) == 0 ) - mode = XVINFO; - else if ( strcmp( argv[1], "-bh" ) == 0 ) - mode = BALLOONHELP; - else if ( strcmp( argv[1], "-bhi" ) == 0 ) - mode = BALLOONHELPI18N; - else if ( strcmp( argv[1], "-hpj" ) == 0 ) - mode = HPJALIAS; - else if ( strcmp( argv[1], "-aliasref" ) == 0 ) - mode = ALIASREF; - else if ( strcmp( argv[1], "-aliasdef" ) == 0 ) - mode = ALIASDEF; - else if ( strcmp( argv[1], "-define" ) == 0 ) - mode = DEFINE; - else { - fprintf( stderr, "Bad mode: %s\n", argv[1] ); - exit(1); - } - - inFile = fopen( argv[2], "r" ); - if (inFile == NULL) { - perror( argv[2] ); - exit(1); - } - outFile = fopen( argv[3], "w" ); - if (outFile == NULL) { - perror( argv[3] ); - exit(1); - } - - process( mode, inFile, outFile ); - exit(0); + FILE * inFile, * outFile; + char *jsonData; + + mode_e mode; + if (argc != 4) { + fprintf(stderr, "Usage: %s (-bh|-bhi) JSONFILE OUTFILE\n", argv[0]); + exit(1); + } + + if (strcmp(argv[1], "-bh") == 0) { + mode = BALLOONHELP; + } else if (strcmp(argv[1], "-bhi") == 0) { + mode = BALLOONHELPI18N; + } else { + fprintf(stderr, "Bad mode: %s\n", argv[1]); + exit(1); + } + + inFile = fopen(argv[2], "r"); + if (inFile == NULL) { + perror(argv[2]); + exit(1); + } + + if (inFile) { + unsigned int length; + fseek(inFile, 0, SEEK_END); + length = ftell(inFile); + fseek(inFile, 0, SEEK_SET); + jsonData = malloc(length + 1); + if (jsonData) { + fread(jsonData, 1, length, inFile); + jsonData[length] = '\0'; + } + fclose(inFile); + } + + outFile = fopen(argv[3], "w"); + if (outFile == NULL) { + perror(argv[3]); + exit(1); + } + + int ret = process(mode, jsonData, outFile); + exit(ret); } |