From: Christos Zoulas Date: Thu, 4 Jan 2018 01:21:32 +0000 (+0000) Subject: Much better GNU message catalog detection (Joerg Jenderek) X-Git-Tag: FILE5_33~37 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0cb71af34ef356ff7aea8f98aa6198702b969b1f;p=file Much better GNU message catalog detection (Joerg Jenderek) --- diff --git a/magic/Magdir/gnu b/magic/Magdir/gnu index 8d5c9721..0eccbe9a 100644 --- a/magic/Magdir/gnu +++ b/magic/Magdir/gnu @@ -1,21 +1,111 @@ #------------------------------------------------------------------------------ -# $File: gnu,v 1.18 2017/03/17 21:35:28 christos Exp $ +# $File: gnu,v 1.19 2018/01/04 01:21:32 christos Exp $ # gnu: file(1) magic for various GNU tools # # GNU nlsutils message catalog file format # # GNU message catalog (.mo and .gmo files) +# Update: Joerg Jenderek +# URL: https://www.gnu.org/software/gettext/manual/html_node/MO-Files.html +# Reference: ftp://ftp.gnu.org/pub/gnu/gettext/gettext-0.19.8.tar.gz/ +# gettext-0.19.8.1/gettext-runtime/intl/gmo.h +# Note: maybe call it like "GNU translation gettext machine object" 0 string \336\22\4\225 GNU message catalog (little endian), ->6 leshort x revision %d. ->4 leshort >0 \b%d, ->>8 lelong x %d messages, ->>36 lelong x %d sysdep messages ->4 leshort =0 \b%d, ->>8 lelong x %d messages +#0 ulelong 0x950412DE GNU-format message catalog data +# TODO: write lines in such a way that code can also be called for big endian variant +#>0 use gettext-object +#0 name gettext-object +>4 ulelong x revision +!:mime application/x-gettext-translation +# mo extension is also used for Easeus Partition Master PE32 executable module +# like ConvertFatToNTFS.mo +!:ext gmo/mo +# only found three revision combinations 0.0 0.1 1.1 as unsigned 32-bit +# major revision +>4 ulelong/0xFFff x %u. +# minor revision +>4 ulelong&0x0000FFff x \b%u +>>8 ulelong x \b, %u message +# plural s +>>8 ulelong >1 \bs +# size of hashing table +#>20 ulelong x \b, %u hash +#>20 ulelong >1 \bes +#>24 ulelong x at 0x%x +# for revsion x.0 offset of table with originals is 1Ch if directly after header +>4 ulelong&0x0000FFff =0 +>>12 ulelong !0x1C \b, at 0x%x string table +# but for x.1 table offset i found is 30h. That means directly after bigger header +>4 ulelong&0x0000FFff >0 +>>12 ulelong !0x30 \b, at 0x%x string table +# The following variables are only used in .mo files with minor revision >= 1 +# number of system dependent segments +#>>28 ulelong x \b, %u segment +#>>28 ulelong >1 \bs +# offset of table describing system dependent segments +#>>32 ulelong x at 0x%x +# number of system dependent strings pairs +>>36 ulelong x \b, %u sysdep message +>>36 ulelong >1 \bs +# offset of table with start offsets of original sysdep strings +#>>40 ulelong x \b, at 0x%x sysdep strings +# offset of table with start offsets of translated sysdep strings +#>>44 ulelong x \b, at 0x%x sysdep translations +# >>(44.l) ulelong x 0x%x chars +# >>>&0 ulelong x at 0x%x +# >>>>(&-4) string x "%s" +# string table after big header +#>>48 ubequad x \b, string table 0x%llx +# +# 0th string length seems to be always 0 +#>(12.l) ulelong x \b, %u chars +#>>&0 ulelong x at 0x%x +# if 1st string length positiv inspect offset and string +#>(12.l+8) ulelong >0 \b, %u chars +#>>&0 ulelong x at 0x%x +# if 2nd string length positiv inspect offset and string +# >(12.l+16) ulelong >0 \b, %u chars +# >>&0 ulelong x at 0x%x +# skip newline byte +#>>>(&-4) ubyte =0x0A +#>>>>&0 string x "%s" +#>>>(&-4) ubyte !0x0A +#>>>>&-1 string x '%s' +# offset of table with translation strings +#>16 ulelong x \b, at 0x%x translation table +# check translation 0 length and offset +>(16.l) ulelong >0 +>>&0 ulelong x +# translation 0 seems to be often Project-Id with name and version +>>>(&-4) string x \b, %s +# trans. 1 with bytes >= 1 unlike icoutils-0.31.0\po\en@boldquot.gmo with 1 NL +>(16.l+8) ulelong >1 +>>&0 ulelong x +>>>(&-4) ubyte !0x0A +>>>>&-1 string x '%s' +# 1 New Line like in tar-1.29\po\de.gmo +>>>(&-4) ubyte =0x0A +>>>>&0 ubyte !0x0A +>>>>>&-1 string x '%s' +# 2nd New Line like in parted-3.1\po\de.gmo +>>>>&0 ubyte =0x0A +>>>>>&0 string x '%s' 0 string \225\4\22\336 GNU message catalog (big endian), +#0 ubelong 0x950412DE GNU-format message catalog data +!:mime application/x-gettext-translation +!:ext gmo/mo +# TODO: for big endian use same code as for little endian +#>0 use \^gettext-object +# DEBUG code +#>16 ubelong x \b, at 0x%x translation table +#>(16.L) ubelong x 0x%x chars +#>>&0 ubelong x at 0x%x +# unexpected value HERE! +#>>>(&-4) ubequad x 0x%llx +# >4 beshort x revision %d. >6 beshort >0 \b%d, >>8 belong x %d messages, @@ -78,8 +168,6 @@ >7 string 02 \b (frcode) # Files produced by GNU gettext -0 long 0xDE120495 GNU-format message catalog data -0 long 0x950412DE GNU-format message catalog data # gettext message catalogue 0 search/1024 \nmsgid