Daniel Stenberg | 8d38c96 | 2002-09-24 12:39:33 +0000 | [diff] [blame] | 1 | /*************************************************************************** |
| 2 | * __________ __ ___. |
| 3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ |
| 4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / |
| 5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < |
| 6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ |
| 7 | * \/ \/ \/ \/ \/ |
| 8 | * $Id$ |
| 9 | * |
| 10 | * Copyright (C) 2002 Daniel Stenberg |
| 11 | * |
Daniel Stenberg | 2acc0ac | 2008-06-28 18:10:04 +0000 | [diff] [blame] | 12 | * This program is free software; you can redistribute it and/or |
| 13 | * modify it under the terms of the GNU General Public License |
| 14 | * as published by the Free Software Foundation; either version 2 |
| 15 | * of the License, or (at your option) any later version. |
Daniel Stenberg | 8d38c96 | 2002-09-24 12:39:33 +0000 | [diff] [blame] | 16 | * |
| 17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| 18 | * KIND, either express or implied. |
| 19 | * |
| 20 | ****************************************************************************/ |
| 21 | |
Thomas Martitz | 6a9a819 | 2010-12-25 18:43:34 +0000 | [diff] [blame] | 22 | #include <stdio.h> |
Thomas Martitz | 2c2e261 | 2010-08-27 12:38:25 +0000 | [diff] [blame] | 23 | #include "file.h" |
Daniel Stenberg | 8d38c96 | 2002-09-24 12:39:33 +0000 | [diff] [blame] | 24 | |
| 25 | #include "language.h" |
| 26 | #include "lang.h" |
| 27 | #include "debug.h" |
Jens Arnold | 0f04029 | 2005-01-19 21:43:15 +0000 | [diff] [blame] | 28 | #include "string.h" |
Tomer Shalev | 5da7507 | 2009-10-05 21:32:29 +0000 | [diff] [blame] | 29 | #ifdef HAVE_LCD_BITMAP |
Tomer Shalev | b0a9938 | 2009-10-05 21:13:55 +0000 | [diff] [blame] | 30 | #include "viewport.h" |
Tomer Shalev | 5da7507 | 2009-10-05 21:32:29 +0000 | [diff] [blame] | 31 | #endif |
Daniel Stenberg | 8d38c96 | 2002-09-24 12:39:33 +0000 | [diff] [blame] | 32 | |
Nils Wallménius | 4317ff9 | 2008-12-03 12:14:46 +0000 | [diff] [blame] | 33 | /* The following header is generated by the build system and only defines |
| 34 | MAX_LANGUAGE_SIZE to be the size of the largest currently available |
| 35 | language! */ |
| 36 | #include "max_language_size.h" |
| 37 | |
Tomer Shalev | 2a91a9a | 2009-10-04 22:25:52 +0000 | [diff] [blame] | 38 | /* These defines must match the initial bytes in the binary lang file */ |
| 39 | /* See tools/genlang (TODO: Use common include for both) */ |
| 40 | #define LANGUAGE_COOKIE 0x1a |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 41 | #define LANGUAGE_VERSION 0x06 |
Tomer Shalev | 6d80565 | 2009-10-05 11:43:38 +0000 | [diff] [blame] | 42 | #define LANGUAGE_FLAG_RTL 0x01 |
Nils Wallménius | 4317ff9 | 2008-12-03 12:14:46 +0000 | [diff] [blame] | 43 | |
Tomer Shalev | 6d80565 | 2009-10-05 11:43:38 +0000 | [diff] [blame] | 44 | #define HEADER_SIZE 4 |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 45 | #define SUBHEADER_SIZE 6 |
Nils Wallménius | 4317ff9 | 2008-12-03 12:14:46 +0000 | [diff] [blame] | 46 | |
Daniel Stenberg | 8d38c96 | 2002-09-24 12:39:33 +0000 | [diff] [blame] | 47 | static unsigned char language_buffer[MAX_LANGUAGE_SIZE]; |
Tomer Shalev | 6d80565 | 2009-10-05 11:43:38 +0000 | [diff] [blame] | 48 | static unsigned char lang_options = 0; |
| 49 | |
Tom Ross | 9fbf346 | 2009-10-17 06:07:50 +0000 | [diff] [blame] | 50 | void lang_init(const unsigned char *builtin, unsigned char **dest, int count) |
Tomer Shalev | 6d80565 | 2009-10-05 11:43:38 +0000 | [diff] [blame] | 51 | { |
Tom Ross | 9fbf346 | 2009-10-17 06:07:50 +0000 | [diff] [blame] | 52 | while(count--) { |
| 53 | *dest++ = (unsigned char *)builtin; |
| 54 | /* advance pointer to next string */ |
| 55 | builtin += strlen((char *)builtin) + 1; |
| 56 | } |
Tomer Shalev | 6d80565 | 2009-10-05 11:43:38 +0000 | [diff] [blame] | 57 | } |
| 58 | |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 59 | int lang_load(const char *filename, const unsigned char *builtin, |
| 60 | unsigned char **dest, unsigned char *buffer, |
| 61 | unsigned int user_num, int max_lang_size, |
| 62 | unsigned int max_id) |
Daniel Stenberg | 8d38c96 | 2002-09-24 12:39:33 +0000 | [diff] [blame] | 63 | { |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 64 | int lang_size; |
Daniel Stenberg | 571e8a2 | 2002-09-24 12:48:23 +0000 | [diff] [blame] | 65 | int fd = open(filename, O_RDONLY); |
Daniel Stenberg | 2d8aef9 | 2002-09-24 13:53:41 +0000 | [diff] [blame] | 66 | int retcode=0; |
Tomer Shalev | 2a91a9a | 2009-10-04 22:25:52 +0000 | [diff] [blame] | 67 | unsigned char lang_header[HEADER_SIZE]; |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 68 | unsigned char sub_header[SUBHEADER_SIZE]; |
Rafaël Carré | 94f5f5b | 2010-09-21 08:25:52 +0000 | [diff] [blame] | 69 | unsigned int id, foffset; |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 70 | |
Nils Wallménius | a019964 | 2008-04-16 19:51:43 +0000 | [diff] [blame] | 71 | if(fd < 0) |
Daniel Stenberg | 2d8aef9 | 2002-09-24 13:53:41 +0000 | [diff] [blame] | 72 | return 1; |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 73 | read(fd, lang_header, HEADER_SIZE); |
| 74 | if((lang_header[0] == LANGUAGE_COOKIE) && |
| 75 | (lang_header[1] == LANGUAGE_VERSION) && |
| 76 | (lang_header[2] == TARGET_ID)) { |
| 77 | /* jump to the proper entry in the table of subheaders */ |
| 78 | lseek(fd, user_num * SUBHEADER_SIZE, SEEK_CUR); |
| 79 | read(fd, sub_header, SUBHEADER_SIZE); |
| 80 | /* read in information about the requested lang */ |
Rafaël Carré | 94f5f5b | 2010-09-21 08:25:52 +0000 | [diff] [blame] | 81 | #if 0 /* unused */ |
| 82 | unsigned int num_strings = (sub_header[0]<<8) | sub_header[1]; |
| 83 | #endif |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 84 | lang_size = (sub_header[2]<<8) | sub_header[3]; |
| 85 | foffset = (sub_header[4]<<8) | sub_header[5]; |
| 86 | if(lang_size <= max_lang_size) { |
Tom Ross | 9fbf346 | 2009-10-17 06:07:50 +0000 | [diff] [blame] | 87 | /* initialize with builtin */ |
Teruaki Kawashima | 4f1d9b1 | 2010-07-11 15:10:01 +0000 | [diff] [blame] | 88 | lang_init(builtin, dest, max_id); |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 89 | lseek(fd, foffset, SEEK_SET); |
| 90 | read(fd, buffer, lang_size); |
Daniel Stenberg | 8d38c96 | 2002-09-24 12:39:33 +0000 | [diff] [blame] | 91 | |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 92 | while(lang_size>3) { |
| 93 | id = ((buffer[0]<<8) | buffer[1]); /* get two-byte id */ |
| 94 | buffer += 2; /* pass the id */ |
| 95 | if(id < max_id) { |
Daniel Stenberg | 5c83487 | 2005-02-22 12:55:21 +0000 | [diff] [blame] | 96 | #if 0 |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 97 | DEBUGF("%2x New: %30s ", id, buffer); |
| 98 | DEBUGF("Replaces: %s\n", dest[id]); |
Daniel Stenberg | 4ce3f72 | 2002-10-29 12:31:34 +0000 | [diff] [blame] | 99 | #endif |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 100 | dest[id] = buffer; /* point to this string */ |
Daniel Stenberg | 4ce3f72 | 2002-10-29 12:31:34 +0000 | [diff] [blame] | 101 | } |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 102 | while(*buffer) { /* pass the string */ |
| 103 | lang_size--; |
| 104 | buffer++; |
| 105 | } |
| 106 | lang_size-=3; /* the id and the terminating zero */ |
| 107 | buffer++; /* pass the terminating zero-byte */ |
Daniel Stenberg | 571e8a2 | 2002-09-24 12:48:23 +0000 | [diff] [blame] | 108 | } |
Daniel Stenberg | 8d38c96 | 2002-09-24 12:39:33 +0000 | [diff] [blame] | 109 | } |
Daniel Stenberg | 571e8a2 | 2002-09-24 12:48:23 +0000 | [diff] [blame] | 110 | else { |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 111 | DEBUGF("Language %s too large: %d\n", filename, lang_size); |
Daniel Stenberg | 2d8aef9 | 2002-09-24 13:53:41 +0000 | [diff] [blame] | 112 | retcode = 2; |
Daniel Stenberg | 571e8a2 | 2002-09-24 12:48:23 +0000 | [diff] [blame] | 113 | } |
Daniel Stenberg | 8d38c96 | 2002-09-24 12:39:33 +0000 | [diff] [blame] | 114 | } |
| 115 | else { |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 116 | DEBUGF("Illegal language file\n"); |
Daniel Stenberg | 2d8aef9 | 2002-09-24 13:53:41 +0000 | [diff] [blame] | 117 | retcode = 3; |
Daniel Stenberg | 8d38c96 | 2002-09-24 12:39:33 +0000 | [diff] [blame] | 118 | } |
Daniel Stenberg | 571e8a2 | 2002-09-24 12:48:23 +0000 | [diff] [blame] | 119 | close(fd); |
Tomer Shalev | d5b076b | 2009-10-11 20:15:22 +0000 | [diff] [blame] | 120 | lang_options = retcode ? 0 : lang_header[3]; |
Daniel Stenberg | 2d8aef9 | 2002-09-24 13:53:41 +0000 | [diff] [blame] | 121 | return retcode; |
Daniel Stenberg | 8d38c96 | 2002-09-24 12:39:33 +0000 | [diff] [blame] | 122 | } |
Jonathan Gordon | 340f323 | 2009-09-26 00:58:32 +0000 | [diff] [blame] | 123 | |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 124 | int lang_core_load(const char *filename) |
| 125 | { |
| 126 | return lang_load(filename, core_language_builtin, language_strings, |
| 127 | language_buffer, 0, MAX_LANGUAGE_SIZE, |
| 128 | LANG_LAST_INDEX_IN_ARRAY); |
| 129 | } |
| 130 | |
Tom Ross | 9fbf346 | 2009-10-17 06:07:50 +0000 | [diff] [blame] | 131 | int lang_english_to_id(const char *english) |
Jonathan Gordon | 340f323 | 2009-09-26 00:58:32 +0000 | [diff] [blame] | 132 | { |
| 133 | int i; |
Tom Ross | ec2737b | 2009-10-18 00:56:42 +0000 | [diff] [blame] | 134 | unsigned char *ptr = (unsigned char *) core_language_builtin; |
Jonathan Gordon | 340f323 | 2009-09-26 00:58:32 +0000 | [diff] [blame] | 135 | |
| 136 | for (i = 0; i < LANG_LAST_INDEX_IN_ARRAY; i++) { |
| 137 | if (!strcmp(ptr, english)) |
| 138 | return i; |
| 139 | ptr += strlen((char *)ptr) + 1; /* advance pointer to next string */ |
| 140 | } |
| 141 | return -1; |
| 142 | } |
Tom Ross | 9fbf346 | 2009-10-17 06:07:50 +0000 | [diff] [blame] | 143 | |
| 144 | int lang_is_rtl(void) |
| 145 | { |
| 146 | return (lang_options & LANGUAGE_FLAG_RTL) != 0; |
| 147 | } |