diff options
author | Jens Arnold <amiconn@rockbox.org> | 2005-01-19 21:43:15 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2005-01-19 21:43:15 +0000 |
commit | 0f0402929397bc020fa6e8f3fd9b78185cf76318 (patch) | |
tree | b51cdd3cd365f0b587e88246c8cf5ef6de459bf4 | |
parent | 3c2fefdb99b24a000a5d896097cba479ad0e62a7 (diff) | |
download | rockbox-0f0402929397bc020fa6e8f3fd9b78185cf76318.tar.gz rockbox-0f0402929397bc020fa6e8f3fd9b78185cf76318.zip |
New way of handling the builtin language strings. Now the string pointers are no longer stored as initialised data, but calculated by walking one long string containing all language strings separated by \0. While this doesn't need more RAM, it fixes the problem that loading incomplete .lng files after complete ones did not reset the missing strings to the default, and it also decreases the binary size by >1700 bytes.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5608 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/language.c | 13 | ||||
-rw-r--r-- | apps/language.h | 3 | ||||
-rw-r--r-- | apps/main.c | 2 | ||||
-rwxr-xr-x | tools/genlang | 15 |
4 files changed, 29 insertions, 4 deletions
diff --git a/apps/language.c b/apps/language.c index 2b9b6ff30b..847100e7da 100644 --- a/apps/language.c +++ b/apps/language.c | |||
@@ -25,9 +25,21 @@ extern int printf(const char *format, ...); | |||
25 | #include "language.h" | 25 | #include "language.h" |
26 | #include "lang.h" | 26 | #include "lang.h" |
27 | #include "debug.h" | 27 | #include "debug.h" |
28 | #include "string.h" | ||
28 | 29 | ||
29 | static unsigned char language_buffer[MAX_LANGUAGE_SIZE]; | 30 | static unsigned char language_buffer[MAX_LANGUAGE_SIZE]; |
30 | 31 | ||
32 | void lang_init(void) | ||
33 | { | ||
34 | int i; | ||
35 | unsigned char *ptr = (unsigned char *) language_builtin; | ||
36 | |||
37 | for (i = 0; i < LANG_LAST_INDEX_IN_ARRAY; i++) { | ||
38 | language_strings[i] = ptr; | ||
39 | ptr += strlen(ptr) + 1; /* advance pointer to next string */ | ||
40 | } | ||
41 | } | ||
42 | |||
31 | int lang_load(const char *filename) | 43 | int lang_load(const char *filename) |
32 | { | 44 | { |
33 | int filesize; | 45 | int filesize; |
@@ -39,6 +51,7 @@ int lang_load(const char *filename) | |||
39 | if(filesize != MAX_LANGUAGE_SIZE) { | 51 | if(filesize != MAX_LANGUAGE_SIZE) { |
40 | if((language_buffer[0] == LANGUAGE_COOKIE) && | 52 | if((language_buffer[0] == LANGUAGE_COOKIE) && |
41 | (language_buffer[1] == LANGUAGE_VERSION)) { | 53 | (language_buffer[1] == LANGUAGE_VERSION)) { |
54 | lang_init(); /* initialize with builtin */ | ||
42 | unsigned char *ptr=&language_buffer[2]; | 55 | unsigned char *ptr=&language_buffer[2]; |
43 | int id; | 56 | int id; |
44 | filesize-=2; | 57 | filesize-=2; |
diff --git a/apps/language.h b/apps/language.h index 62974459a5..80242962ea 100644 --- a/apps/language.h +++ b/apps/language.h | |||
@@ -24,5 +24,8 @@ | |||
24 | #define LANGUAGE_COOKIE 0x1a | 24 | #define LANGUAGE_COOKIE 0x1a |
25 | #define LANGUAGE_VERSION 0x02 | 25 | #define LANGUAGE_VERSION 0x02 |
26 | 26 | ||
27 | /* Initialize language array with the builtin strings */ | ||
28 | void lang_init(void); | ||
29 | |||
27 | /* load a given language file */ | 30 | /* load a given language file */ |
28 | int lang_load(const char *filename); | 31 | int lang_load(const char *filename); |
diff --git a/apps/main.c b/apps/main.c index cc270ba136..ef8ca7bea7 100644 --- a/apps/main.c +++ b/apps/main.c | |||
@@ -126,6 +126,7 @@ void init(void) | |||
126 | lcd_init(); | 126 | lcd_init(); |
127 | font_init(); | 127 | font_init(); |
128 | show_logo(); | 128 | show_logo(); |
129 | lang_init(); | ||
129 | settings_reset(); | 130 | settings_reset(); |
130 | settings_calc_config_sector(); | 131 | settings_calc_config_sector(); |
131 | settings_load(SETTINGS_ALL); | 132 | settings_load(SETTINGS_ALL); |
@@ -171,6 +172,7 @@ void init(void) | |||
171 | 172 | ||
172 | font_init(); | 173 | font_init(); |
173 | show_logo(); | 174 | show_logo(); |
175 | lang_init(); | ||
174 | 176 | ||
175 | set_irq_level(0); | 177 | set_irq_level(0); |
176 | #ifdef DEBUG | 178 | #ifdef DEBUG |
diff --git a/tools/genlang b/tools/genlang index e13cd3faf9..2677735d2e 100755 --- a/tools/genlang +++ b/tools/genlang | |||
@@ -30,8 +30,11 @@ print HFILE <<MOO | |||
30 | */ | 30 | */ |
31 | #define str(x) language_strings[x] | 31 | #define str(x) language_strings[x] |
32 | 32 | ||
33 | /* this is the array with all the strings */ | 33 | /* this is the array for holding the string pointers. |
34 | It will be initialized at runtime. */ | ||
34 | extern unsigned char *language_strings[]; | 35 | extern unsigned char *language_strings[]; |
36 | /* this contains the concatenation of all strings, separated by \0 chars */ | ||
37 | extern const unsigned char language_builtin[]; | ||
35 | 38 | ||
36 | /* The enum below contains all available strings */ | 39 | /* The enum below contains all available strings */ |
37 | enum { | 40 | enum { |
@@ -41,8 +44,11 @@ MOO | |||
41 | print CFILE <<MOO | 44 | print CFILE <<MOO |
42 | /* This file was automaticly generated using genlang, the strings come | 45 | /* This file was automaticly generated using genlang, the strings come |
43 | from "$input" */ | 46 | from "$input" */ |
47 | |||
48 | #include "$prefix.h" | ||
44 | 49 | ||
45 | unsigned char *language_strings[]={ | 50 | unsigned char *language_strings[LANG_LAST_INDEX_IN_ARRAY]; |
51 | const unsigned char language_builtin[] = | ||
46 | MOO | 52 | MOO |
47 | ; | 53 | ; |
48 | 54 | ||
@@ -85,7 +91,8 @@ while(<LANG>) { | |||
85 | } | 91 | } |
86 | else { | 92 | else { |
87 | push @hfile, $set{'id'}; | 93 | push @hfile, $set{'id'}; |
88 | print CFILE " $value,\n"; | 94 | $value =~ s/\"$/\\0\"/; |
95 | print CFILE " $value\n"; | ||
89 | } | 96 | } |
90 | 97 | ||
91 | undef %set; | 98 | undef %set; |
@@ -118,7 +125,7 @@ MOO | |||
118 | ; | 125 | ; |
119 | 126 | ||
120 | print CFILE <<MOO | 127 | print CFILE <<MOO |
121 | }; | 128 | ; |
122 | /* end of generated string list */ | 129 | /* end of generated string list */ |
123 | MOO | 130 | MOO |
124 | ; | 131 | ; |