2 alien alien.data alien.libraries alien.syntax
3 destructors formatting io.binary kernel libc locals
5 sequences windows.types
10 << "version" "version.dll" stdcall add-library >>
14 FUNCTION: DWORD GetFileVersionInfoSizeA (
15 LPCSTR lptstrFilename,
17 FUNCTION: DWORD GetFileVersionInfoSizeW (
18 LPCWSTR lptstrFilename,
20 ALIAS: GetFileVersionInfoSize GetFileVersionInfoSizeW
22 FUNCTION: BOOL GetFileVersionInfoA (
23 LPCSTR lptstrFilename,
27 FUNCTION: BOOL GetFileVersionInfoW (
28 LPCWSTR lptstrFilename,
32 ALIAS: GetFileVersionInfo GetFileVersionInfoW
34 FUNCTION: BOOL VerQueryValueA (
39 FUNCTION: BOOL VerQueryValueW (
44 ALIAS: VerQueryValue VerQueryValueW
46 : high-low ( integer -- high low )
47 [ -16 shift ] [ 16 bits ] [ compose ] keep bi ;
49 : translation-prefix ( integer -- string )
50 high-low swap "\\StringFileInfo\\%04x%04x\\" sprintf ;
52 : version-query ( integer -- string )
53 translation-prefix "FileVersion" append ;
55 :: query-dword ( data query -- integer/f )
56 f LPDWORD <ref> :> result
57 data query result f VerQueryValue [
58 result LPDWORD deref 4 memory>byte-array le>
61 :: query-str ( data query -- string/f )
62 f LPCSTR <ref> :> result
63 data query result f VerQueryValue [ result LPCSTR deref ] [ f ] if ;
65 : first-translation ( data -- integer/f )
66 "\\VarFileInfo\\Translation" query-dword ;
68 :: (file-version) ( path data-size -- string/f )
70 data-size malloc &free :> data
71 path 0 data-size data GetFileVersionInfo [
72 data first-translation [
73 data swap version-query query-str res!
76 ] with-destructors res ;
78 : file-version ( path -- string/f )
79 dup f GetFileVersionInfoSize dup 0 > [ (file-version) ] [ 2drop f ] if ;