]> granicus.if.org Git - file/commitdiff
Much better GNU message catalog detection (Joerg Jenderek)
authorChristos Zoulas <christos@zoulas.com>
Thu, 4 Jan 2018 01:21:32 +0000 (01:21 +0000)
committerChristos Zoulas <christos@zoulas.com>
Thu, 4 Jan 2018 01:21:32 +0000 (01:21 +0000)
magic/Magdir/gnu

index 8d5c9721588b9796857c9b0ce2b6b4bad55c3435..0eccbe9a6f61c3056491982abc2c3165150f6682 100644 (file)
 
 #------------------------------------------------------------------------------
-# $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,
 >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