gecko-dev/modules/libpref/l10n/resources.c

374 строки
8.8 KiB
C

/* -*- 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;
}