| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 | #!/bin/sh## makelang.sh - multi-language support script#  for generating lang_xx.bin (secondary language binary file)## Input files:#  lang_en.txt#  lang_en_xx.txt## Output files:#  lang_en.tmp (temporary, will be removed when finished)#  lang_en_xx.tmp ==||==#  lang_en_xx.dif ==||==#  lang_xx.txt### Selected language:LNG=$1if [ -z "$LNG" ]; then LNG='cz'; fi##finish(){ if [ $1 -eq 0 ]; then  if [ -e lang_en.tmp ]; then rm lang_en.tmp; fi  if [ -e lang_en_$LNG.tmp ]; then rm lang_en_$LNG.tmp; fi  if [ -e lang_en_$LNG.dif ]; then rm lang_en_$LNG.dif; fi fi# echo >&2 if [ $1 -eq 0 ]; then  echo "make_lang.sh finished with success" >&2 else  echo "make_lang.sh finished with errors!" >&2 fi exit $1}make_lang(){LNG=$1echo "make_lang.sh started" >&2echo "selected language=$LNG" >&2#check if input files existsecho -n " checking input files..." >&2if [ ! -e lang_en.txt ]; then echo "NG!  file lang_en.txt not found!" >&2; exit 1; fiif [ ! -e lang_en_$LNG.txt ]; then echo "NG!  file lang_en_$LNG.txt not found!" >&2; exit 1; fiecho "OK" >&2#filter comment and empty lines from key and dictionary files, create temporary filesecho -n " creating tmp files..." >&2cat lang_en.txt | sed "/^$/d;/^#/d" > lang_en.tmpcat lang_en_$LNG.txt | sed "/^$/d;/^#/d" > lang_en_$LNG.tmpecho "OK" >&2#cat lang_en_$LNG.tmp | sed 'n;d' >test1.txt#compare files using diff and check for differencesecho -n " comparing tmp files..." >&2if ! cat lang_en_$LNG.tmp | sed 'n;d' | diff lang_en.tmp - > lang_en_$LNG.dif; then echo "NG!" >&2 echo "Entries in lang_en_$LNG.txt are different from lang_en.txt!" >&2 echo "please check lang_en_$LNG.dif" >&2 finish 1fiecho "OK" >&2#generate lang_xx.txt (secondary language text data sorted by ids)echo -n " generating lang_$LNG.txt..." >&2cat lang_en_$LNG.tmp | sed '1~2d' | sed "s/^\"\\\\x00/\"/" > lang_$LNG.txtecho "OK" >&2#generate lang_xx.dat (secondary language text data in binary form)echo -n " generating lang_$LNG.dat..." >&2cat lang_$LNG.txt | sed "s/\\\\/\\\\\\\\/g" | while read s; do s=${s#\"} s=${s%\"} /bin/echo -e -n "$s\x00"done >lang_$LNG.datecho "OK" >&2#calculate variableslt_magic='\xa5\x5a\xb4\x4b'lt_count=$(grep -c '^' lang_$LNG.txt)lt_data_size=$(wc -c lang_$LNG.dat | cut -f1 -d' ')lt_offs_size=$((2 * $lt_count))lt_size=$((16 + $lt_offs_size + $lt_data_size))lt_chsum=0lt_code='\xff\xff'lt_resv1='\xff\xff\xff\xff'case "$LNG" in *en*) lt_code='\x6e\x65' ;; *cz*) lt_code='\x73\x63' ;; *de*) lt_code='\x65\x64' ;; *es*) lt_code='\x73\x65' ;; *it*) lt_code='\x74\x69' ;; *pl*) lt_code='\x6c\x70' ;;esac#generate lang_xx.ofs (secondary language text data offset table)echo -n " generating lang_$LNG.ofs..." >&2cat lang_$LNG.txt | sed "s/\\\\x[0-9a-f][0-9a-f]/\./g;s/\\\\[0-7][0-7][0-7]/\./g" |\ awk 'BEGIN { o='$((16 + $lt_offs_size))';} { printf("%d\n",o); o+=(length($0)-1); }' > lang_$LNG.ofsecho "OK" >&2#generate lang_xx.bin (secondary language result binary file)echo " generating lang_$LNG.bin:" >&2#create empty filedd if=/dev/zero of=lang_$LNG.bin bs=1 count=$lt_size 2>/dev/null#awk code to format ui16 variables for ddawk_ui16='{ h=int($1/256); printf("\\x%02x\\x%02x\n", int($1-256*h), h); }'#write data to binary file with ddecho -n "  writing header (16 bytes)..." >&2/bin/echo -n -e "$lt_magic" |\ dd of=lang_$LNG.bin bs=1 count=4 seek=0 conv=notrunc 2>/dev/null/bin/echo -n -e $(echo -n "$lt_size" | awk "$awk_ui16") |\ dd of=lang_$LNG.bin bs=1 count=2 seek=4 conv=notrunc 2>/dev/null/bin/echo -n -e $(echo -n "$lt_count" | awk "$awk_ui16") |\ dd of=lang_$LNG.bin bs=1 count=2 seek=6 conv=notrunc 2>/dev/null/bin/echo -n -e $(echo -n "$lt_chsum" | awk "$awk_ui16") |\ dd of=lang_$LNG.bin bs=1 count=2 seek=8 conv=notrunc 2>/dev/null/bin/echo -n -e "$lt_code" |\ dd of=lang_$LNG.bin bs=1 count=2 seek=10 conv=notrunc 2>/dev/null/bin/echo -n -e "$lt_resv1" |\ dd of=lang_$LNG.bin bs=1 count=4 seek=12 conv=notrunc 2>/dev/nullecho "OK" >&2echo -n "  writing offset table ($lt_offs_size bytes)..." >&2/bin/echo -n -e $(cat lang_$LNG.ofs | awk "$awk_ui16" | tr -d '\n'; echo) |\ dd of=./lang_$LNG.bin bs=1 count=$lt_offs_size seek=16 conv=notrunc 2>/dev/nullecho "OK" >&2echo -n "  writing text data ($lt_data_size bytes)..." >&2dd if=./lang_$LNG.dat of=./lang_$LNG.bin bs=1 count=$lt_data_size seek=$((16 + $lt_offs_size)) conv=notrunc 2>/dev/nullecho "OK" >&2#update signatureecho -n "  updating signature..." >&2dd if=lang_en.bin of=lang_$LNG.bin bs=1 count=4 skip=6 seek=12 conv=notrunc 2>/dev/nullecho "OK" >&2#calculate and update checksumlt_chsum=$(cat lang_$LNG.bin | xxd | cut -c11-49 | tr ' ' "\n" | sed '/^$/d' | awk 'BEGIN { sum = 0; } { sum += strtonum("0x"$1); if (sum > 0xffff) sum -= 0x10000; } END { printf("%x\n", sum); }')/bin/echo -n -e $(echo -n $((0x$lt_chsum)) | awk "$awk_ui16") |\ dd of=lang_$LNG.bin bs=1 count=2 seek=8 conv=notrunc 2>/dev/nullecho " lang_table details:" >&2echo "  lt_count = $lt_count" >&2echo "  lt_size  = $lt_size" >&2echo "  lt_chsum = $lt_chsum" >&2}echo $LNGif [ "$LNG" = "all" ]; then ./lang-build.sh en make_lang cz make_lang de make_lang es make_lang it make_lang pl exit 0else make_lang $LNGfifinish 0
 |