CHDK_DE Vorschauversion  Trunk Rev. 5163
 Alle Datenstrukturen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
lang.c-Dateireferenz
#include "stdlib.h"
#include "lang.h"
#include "fileutil.h"
+ Include-Abhängigkeitsdiagramm für lang.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define MAX_LANGID   0x1000
 

Funktionen

void lang_init (int num)
 
static char * placelstr (int size)
 
static void lang_add_string (int num, const char *str)
 
int lang_parse_from_mem (char *buf, int size)
 
char * load_builtin_lang_strings (int cnt, short *array)
 
void lang_map_preparsed_from_mem (char *gui_lang_default, int num)
 
void lang_load_from_file (const char *filename)
 
char * lang_str (int str)
 
unsigned int lang_strhash31 (int langid)
 

Variablen

static char * preparsed_lang_default_start =0
 
static short * strings = NULL
 
static int count = 0
 
static char * langbuf = NULL
 
static int langbuflen = 0
 
static int lbpointer
 

Makro-Dokumentation

#define MAX_LANGID   0x1000

Definiert in Zeile 9 der Datei lang.c.

Dokumentation der Funktionen

static void lang_add_string ( int  num,
const char *  str 
)
static

Definiert in Zeile 59 der Datei lang.c.

59  {
60  int f=0;
61  char *p;
62 
63  if (strings && num<count) {
64 
65  p = placelstr(strlen(str)+1);
66  if (p) {
67  strings[num] = -(1 + p - langbuf); // lang string offsets are encoded as negative
68  for (; *str; ++str) {
69  if (f) {
70  if (*str == '"' || *str == '\\') *(p-1)=*str;
71  else if (*str == 'n') *(p-1)='\n';
72  else *p++=*str;
73  f = 0;
74  } else {
75  *p++=*str;
76  if (*str == '\\') {
77  f = 1;
78  }
79  }
80  }
81  *p=0;
82  }
83  }
84 }
void lang_init ( int  num)

Definiert in Zeile 30 der Datei lang.c.

30  {
31 
32  if (strings) {
33  free(strings);
34  count = 0;
35  }
36 
37  ++num;
38  strings = malloc(num*sizeof(short));
39  if (strings) {
40  memset(strings, 0, num*sizeof(short));
41  count = num;
42  }
43 
44 }
void lang_load_from_file ( const char *  filename)

Definiert in Zeile 199 der Datei lang.c.

199  {
200  process_file(filename, lang_parse_from_mem, 1);
201 }
void lang_map_preparsed_from_mem ( char *  gui_lang_default,
int  num 
)

Definiert in Zeile 188 der Datei lang.c.

189 {
190 
191  preparsed_lang_default_start = gui_lang_default;
192  lang_init( num );
193  // preparsed_lang_default_end = // variable not currently needed
195 
196 }
int lang_parse_from_mem ( char *  buf,
int  size 
)

Definiert in Zeile 89 der Datei lang.c.

89  {
90  char *p, *s, *e, *b;
91  int i, langbufneed;
92  char** pstrtmp;
93 
94  if ( size <= 0 )
95  return 0;
96 
97  langbufneed = 0;
98  lbpointer = 0;
99  // allocate temporary array for storing pointers to found strings
100  pstrtmp = malloc(count*sizeof(char*));
101  if (!pstrtmp) {
102  return 0;
103  }
104  // needs to be zeroed
105  memset(pstrtmp, 0, count*sizeof(char*));
106 
107  // initialize _final_ offset array with built-in strings
108  char* load_builtin_lang_strings(int, short*);
110 
111  e = buf-1;
112  while(e) {
113  p = e+1;
114  while (*p && (*p=='\r' || *p=='\n')) ++p; //skip empty lines
115  i = strtol(p, &e, 0/*autodetect base oct-dec-hex*/); // convert "*p" to long "i" and return pointer beyond to e
116  if (e!=p) {
117  p = e;
118  e = strpbrk(p, "\r\n"); //break string with zero on \r|\n
119  if (e) *e=0;
120 
121  while (*p && *p!='\"') ++p; // cut string from "" if it exists
122  if (*p) ++p;
123  s = p;
124  while (*p && (*p!='\"' || *(p-1)=='\\')) ++p;
125  *p=0;
126 
127  // store string address and add its length to total
128  if ((i > 0) && (i<count)) {
129  // ignore string IDs that have zero length built-in string
130  // rationale: built-in strings are always complete (have English fallback),
131  // except for IDs that are disabled for the port
132  //
133  // lang_str() only returns built-in strings at this point
134  b = lang_str(i);
135  if (b && b[0]!=0) {
136  langbufneed += strlen(s) + 1;
137  pstrtmp[i] = s;
138  }
139  }
140  } else { //skip invalid line
141  e = strpbrk(p, "\r\n");
142  if (e) *e=0;
143  }
144  }
145 
146  if ((langbufneed>langbuflen)||(!langbuf)) { // existing buffer is too small or not allocated
147  if (langbuf) {
148  free(langbuf);
149  }
150  langbuf = malloc(langbufneed);
151  if (langbuf) {
152  langbuflen = langbufneed;
153  }
154  else {
155  langbuflen = 0;
156  }
157  }
158  // zeroing is not required (holes between strings will contain junk, but that doesn't hurt)
159  // memset(langbuf, 0, langbuflen);
160 
161  for (i=1; i<count; i++) {
162  if (pstrtmp[i]) { // add string if it exists
163  lang_add_string(i, pstrtmp[i]);
164  }
165  }
166 
167  free(pstrtmp);
168  return 1;
169 }
char* lang_str ( int  str)

Definiert in Zeile 205 der Datei lang.c.

205  {
206  if (str && str<MAX_LANGID) {
207  if (strings && str<count && strings[str]) {
208  if (strings[str]>0) {
209  // string from builtin resource
211  }
212  else if (langbuf) {
213  // string from loaded lang file
214  return langbuf - strings[str] - 1;
215  }
216  }
217  } else { // not ID, just char*
218  return (char*)str;
219  }
220  return "";
221 }
unsigned int lang_strhash31 ( int  langid)

Definiert in Zeile 225 der Datei lang.c.

226 {
227  if ( langid<MAX_LANGID )
228  return langid;
229 
230  unsigned char* str = (unsigned char*)langid;
231  unsigned hash=0;
232  for ( ; *str; str++ )
233  hash = *str ^ (hash<<6) ^ (hash>>25);
234  if ( hash<MAX_LANGID )
235  hash |= (1<<31);
236  return hash;
237 }
char* load_builtin_lang_strings ( int  cnt,
short *  array 
)

Definiert in Zeile 173 der Datei lang.c.

173  {
174  int i;
176 
177  for ( i = 1; i<=cnt; i++ )
178  {
179  array[i] = 1 + p - preparsed_lang_default_start;
180  while (*p) p++;
181  p++;
182  }
183  return p;
184 }
static char* placelstr ( int  size)
static

Definiert in Zeile 48 der Datei lang.c.

48  {
49  char *ret = langbuf + lbpointer;
50  lbpointer += size;
51  if (lbpointer <= langbuflen) {
52  return ret;
53  }
54  return 0;
55 }

Variablen-Dokumentation

int count = 0
static

Definiert in Zeile 24 der Datei lang.c.

char* langbuf = NULL
static

Definiert in Zeile 25 der Datei lang.c.

int langbuflen = 0
static

Definiert in Zeile 26 der Datei lang.c.

int lbpointer
static

Definiert in Zeile 27 der Datei lang.c.

char* preparsed_lang_default_start =0
static

Definiert in Zeile 5 der Datei lang.c.

short* strings = NULL
static

Definiert in Zeile 23 der Datei lang.c.