home *** CD-ROM | disk | FTP | other *** search
- /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- *
- * The contents of this file are subject to the Netscape Public License
- * Version 1.0 (the "NPL"); you may not use this file except in
- * compliance with the NPL. You may obtain a copy of the NPL at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the NPL is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
- * for the specific language governing rights and limitations under the
- * NPL.
- *
- * The Initial Developer of this code under the NPL is Netscape
- * Communications Corporation. Portions created by Netscape are
- * Copyright (C) 1998 Netscape Communications Corporation. All Rights
- * Reserved.
- */
-
- /**********************************************************************
- resources.c
-
- Turns a Netscape.ad file into a netscape.cfg file so we can do
- l10n for Dogbert.
-
- Usage:
- resources Netscape.ad
- **********************************************************************/
-
- #include <stdio.h>
- #include <errno.h>
- #include <string.h>
-
- #include <sechash.h>
-
-
- #define OUT_FILE_NAME "netscape.cfg"
- #define COUNT(a) (sizeof(a)/sizeof((a)[0]))
-
-
- struct mapping {
- char* resource;
- char* pref_name;
- char* verb;
- char* value;
- char mnemonic;
- };
-
-
- struct mapping map[] = {
-
- /* Help Menu labels */
- {"*menuBar*manual", "menu.help.item_0.label"},
- {"*menuBar*relnotes", "menu.help.item_1.label"},
- {"*menuBar*productInfo", "menu.help.item_2.label"},
- {"*menuBar*upgrade", "menu.help.item_4.label"},
- {"*menuBar*registration", "menu.help.item_5.label"},
- {"*menuBar*feedback", "menu.help.item_6.label"},
- {"*menuBar*intl", "menu.help.item_8.label"},
- {"*menuBar*aboutSecurity", "menu.help.item_9.label"},
- {"*menuBar*aboutUsenet", "menu.help.item_10.label"},
- {"*menuBar*aboutplugins", "menu.help.item_12.label"},
- {"*menuBar*aboutfonts", "menu.help.item_13.label"},
-
- /* Help Menu URLs */
- {"*url*manual", "menu.help.item_0.url"},
- {"*url*relnotes", "menu.help.item_1.url"},
- {"*url*productInfo", "menu.help.item_2.url"},
- {"*url*feedback", "menu.help.item_4.url"},
- {"*url*registration", "menu.help.item_5.url"},
- {"*url*upgrade", "menu.help.item_6.url"},
- {"*url*intl", "menu.help.item_8.url"},
- {"*url*aboutSecurity", "menu.help.item_9.url"},
- {"*url*aboutUsenet", "menu.help.item_10.url"},
- {"*url*aboutplugins", "menu.help.item_12.url"},
- {"*url*aboutfonts", "menu.help.item_13.url"},
-
- /* Communicator/Bookmarks/Guide labels */
- {"*menuBar*inetIndex", "menu.places.item_0.label"},
- {"*menuBar*inetWhite", "menu.places.item_1.label"},
- {"*menuBar*inetYellow", "menu.places.item_2.label"},
- {"*menuBar*whatsNew", "menu.places.item_3.label"},
- {"*menuBar*whatsCool", "menu.places.item_4.label"},
-
- /* Communicator/Bookmarks/Guide URLs */
- {"*url.about", "menu.places.item_0.url"},
- {"*url.white", "menu.places.item_1.url"},
- {"*url.yellow", "menu.places.item_2.url"},
- {"*url.whats_new", "menu.places.item_3.url"},
- {"*url.whats_cool", "menu.places.item_4.url"},
-
- /* Toolbar labels */
- {"*toolBar*destinations*inetIndex", "toolbar.places.item_0.label"},
- {"*toolBar*destinations*inetWhite", "toolbar.places.item_1.label"},
- {"*toolBar*destinations*inetYellow", "toolbar.places.item_2.label"},
- {"*toolBar*destinations*whatsNew", "toolbar.places.item_3.label"},
- {"*toolBar*destinations*whatsCool", "toolbar.places.item_4.label"},
-
- /* Toolbar URLs */
- {"*url.about", "toolbar.places.item_0.url"},
- {"*url.white", "toolbar.places.item_1.url"},
- {"*url.yellow", "toolbar.places.item_2.url"},
- {"*url.whats_new", "toolbar.places.item_3.url"},
- {"*url.whats_cool", "toolbar.places.item_4.url"},
-
- /* i18n stuff */
- {"*url.netscape", "browser.startup.homepage", "pref"},
- {"*versionLocale", "intl.accept_languages", "pref"},
-
- /* Personal Toolbar labels */
- /* Personal Toolbar URLs */
- };
-
-
- char output_buf[10 * 1024];
-
-
- /*
- * usage
- */
- void
- usage(char* prog_name)
- {
- fprintf(stderr, "Usage: %s filename\n", prog_name);
- }
-
-
- /*
- * append_to_file
- */
- void
- append_to_file(char buf[])
- {
- strcat(output_buf, buf);
- }
-
-
- /*
- * get_value
- */
- char*
- get_value(char buf[])
- {
- char* ptr = strchr(buf, ':') + 1;
- while ( isspace(*ptr) ) ptr++;
- return ptr;
- }
-
-
- /*
- * is_label
- */
- int
- is_label(char buf[])
- {
- return ( strstr(buf, ".labelString:") != NULL );
- }
-
-
- /*
- * is_mnemonic
- */
- int
- is_mnemonic(char buf[])
- {
- return ( strstr(buf, ".mnemonic:") != NULL );
- }
-
-
- /*
- * is_url
- */
- int
- is_url(char buf[])
- {
- return ( !strncmp(buf, "*url.", 5) );
- }
-
-
- /*
- * process_line
- */
- void
- process_line(char buf[])
- {
- int i;
-
- for ( i = 0; i < COUNT(map); i++ ) {
- if ( !strncmp(map[i].resource, buf, strlen(map[i].resource)) ) {
- if ( is_label(buf) ) {
- map[i].value = strdup(get_value(buf));
- } else
- if ( is_mnemonic(buf) ) {
- map[i].mnemonic = *get_value(buf);
- } else {
- map[i].value = strdup(get_value(buf));
- }
- }
- }
- }
-
-
- /*
- * obscure
- */
- static void
- obscure(char* buf)
- {
- int i;
- static int offset = 0;
- int len = buf ? strlen(buf) : 0;
-
- for ( i = 0; i < len; i++, offset++ ) {
- buf[i]+= 7;
- }
- }
-
-
- /*
- * write_hash
- */
- static void
- write_hash(FILE* file)
- {
- char buf[256];
- unsigned char digest[16];
- unsigned char magic_key[] = "VonGloda5652TX75235ISBN";
- int len;
-
- MD5Context* md5_cxt = MD5_NewContext();
- MD5_Begin(md5_cxt);
-
- /* start with the magic key */
- MD5_Update(md5_cxt, magic_key, sizeof(magic_key));
-
- MD5_Update(md5_cxt, output_buf, strlen(output_buf));
-
- MD5_End(md5_cxt, digest, &len, 16);
-
- MD5_DestroyContext(md5_cxt, PR_TRUE);
- sprintf(buf, "// %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
- digest[0], digest[1], digest[2], digest[3],
- digest[4], digest[5], digest[6], digest[7],
- digest[8], digest[9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);
-
- obscure(buf);
-
- if ( fwrite(buf, sizeof(char), strlen(buf), file) != strlen(buf) ) {
- perror("fwrite");
- exit(errno);
- }
- }
-
-
- /*
- * output_file
- */
- void
- output_file(FILE* out)
- {
- int i, j, k;
- int len;
- char buf[256];
-
- append_to_file("with ( PrefConfig ) {\n");
-
- for ( i = 0; i < COUNT(map); i++ ) {
- if ( map[i].value ) {
- if ( !is_url(map[i].resource) ) {
- if ( strchr(map[i].value, '&') ) {
- for ( j = 0, k = 0; j < strlen(map[i].value); j++, k++ ) {
- buf[k] = map[i].value[j];
- if ( buf[k] == '&' ) buf[++k] = '&';
- }
- free(map[i].value);
- buf[k] = '\0';
- map[i].value = strdup(buf);
- }
- if ( map[i].mnemonic ) {
- for ( j = 0, k = 0; j < strlen(map[i].value); j++, k++ ) {
- buf[k] = map[i].value[j];
- if ( buf[k] == map[i].mnemonic ) {
- buf[k++] = '&';
- buf[k] = map[i].mnemonic;
- map[i].mnemonic = '\0';
- }
- }
- free(map[i].value);
- buf[k] = '\0';
- map[i].value = strdup(buf);
- }
- }
- sprintf(buf, "%s(\"%s\", \"%s\");\n",
- map[i].verb ? map[i].verb : "config",
- map[i].pref_name,
- map[i].value);
- append_to_file(buf);
- }
- }
-
- append_to_file("}\n");
- write_hash(out);
- len = strlen(output_buf);
- obscure(output_buf);
- fwrite(output_buf, sizeof(char), len, out);
- }
-
-
- /*
- * fatal
- */
- void
- fatal(char* progname, int error)
- {
- fprintf(stderr, "%s failed\n", progname);
- exit(error);
- }
-
-
- /*
- * main
- */
- int
- main(int argc, char* argv[])
- {
- FILE* in;
- FILE* out;
- char buf[64 * 1024];
- int line = 0;
-
- if ( argc != 2 ) {
- usage(argv[0]);
- fatal(argv[0], 1);
- }
-
- if ( (in = fopen(argv[1], "r")) == NULL ) {
- perror(argv[1]);
- fatal(argv[0], errno);
- }
-
- if ( (out = fopen(OUT_FILE_NAME, "w")) == NULL ) {
- perror(OUT_FILE_NAME);
- fatal(argv[0], errno);
- }
-
- while ( fgets(buf, sizeof(buf), in) != NULL ) {
- line++;
- if ( strchr(buf, '\n') == NULL ) {
- fprintf(stderr, "%s, line %d: Line too long\n", argv[1], line);
- fatal(argv[0], 1);
- }
- *(char*) strchr(buf, '\n') = '\0';
- process_line(buf);
- }
-
- output_file(out);
-
- if ( fclose(in) != 0 ) {
- perror(argv[1]);
- fatal(argv[0], errno);
- }
-
- if ( fclose(out) != 0 ) {
- perror(OUT_FILE_NAME);
- fatal(argv[0], errno);
- }
-
- fprintf(stderr, "Created " OUT_FILE_NAME "\n");
-
- return 0;
- }
-
-
-