5 # Parse the NASM version file and produce appropriate macros
7 # The NASM version number is assumed to consist of:
9 # <major>.<minor>[.<subminor>][pl<patchlevel> | rc<number>]]<tail>
11 # ... where <tail> is not necessarily numeric, but if it is of the form
12 # -<digits> it is assumed to be a snapshot release.
14 # This defines the following macros:
19 # NASM_SUBMINOR_VER -- this is zero if no subminor
20 # NASM_PATCHLEVEL_VER -- this is zero is no patchlevel
21 # NASM_SNAPSHOT -- if snapshot
22 # NASM_VERSION_ID -- version number encoded
23 # NASM_VER -- whole version number as a string
43 $version{_line
} = $line;
46 (?
<major
>\d
+)[.](?
<minor
>\d
+)
47 (?
:[.](?
<subminor
>\d
+))?
49 pl
(?
<patchlevel
>\d
+) |
59 for my $key(qw
'major minor subminor patchlevel rc'){
60 my $value = $+{$key} || 0;
61 $version{$key} = $value + 0;
63 for my $key(qw
'snapshot tail'){
65 $version{$key} = $+{$key};
73 # modify %version if this is a release candidate
75 $version{patchlevel
} = $version{rc
} + 90;
77 if($version{subminor
}){
80 $version{subminor
} = 99;
93 # add 'id' and 'xid' to %version
95 ($version{major
} << 24) +
96 ($version{minor
} << 16) +
97 ($version{subminor
} << 8) +
99 $version{xid
} = sprintf('0x%08x',$version{id
});
103 # add 'mangled' to %version
105 my $mangled = sprintf("%d.%02d",$version{major
},$version{minor
});
107 $version{subminor
} ||
108 $version{patchlevel
} ||
111 $mangled .= sprintf(".%02d",$version{subminor
});
114 $version{patchlevel
} ||
117 $mangled .= sprintf(".%02d",$version{patchlevel
})
121 if($version{snapshot
}){
122 $mangled .= '.'.$version{snapshot
}
123 }elsif( $version{tail
}){
124 my $tail = $version{tail
};
129 $version{mangled
} = $mangled;
135 # forward definition of subroutines
143 # jump table to subroutines / variables
151 xid
=> \
$version{xid
},
154 require Data
::Dumper
;
155 $Data::Dumper
::Terse
= 1;
159 # remove any "hidden" keys
160 delete $ret{$_} if /^[_.]/;
162 return Data
::Dumper
::Dumper
(\
%ret);
169 use Scalar
::Util
'reftype';
171 my($arg) = (@ARGV, 'help');
172 local( undef, @ARGV) = @ARGV if @ARGV;
174 my $jump = $jump{$arg} || $jump{help
};
178 my $reftype = reftype
$jump;
180 if($reftype eq 'CODE'){
181 my $ret = $jump->(@ARGV);
182 print "$ret\n" if defined $ret;
184 }elsif($reftype eq 'SCALAR'){
196 # subroutine definitions
200 printf <<END, @version{'major','minor','subminor','patchlevel'};
201 #ifndef NASM_VERSION_H
202 #define NASM_VERSION_H
203 #define NASM_MAJOR_VER %d
204 #define NASM_MINOR_VER %d
205 #define NASM_SUBMINOR_VER %d
206 #define NASM_PATCHLEVEL_VER %d
209 if ($version{snapshot
}) {
210 printf "#define NASM_SNAPSHOT %d\n", $version{snapshot
};
213 printf <<END, @version{'xid','_line'};
214 #define NASM_VERSION_ID %s
215 #define NASM_VER "%s"
216 #endif /* NASM_VERSION_H */
224 printf <<'END', @version{'major','minor','subminor','patchlevel'};
225 %%define __NASM_MAJOR__ %d
226 %%define __NASM_MINOR__ %d
227 %%define __NASM_SUBMINOR__ %d
228 %%define __NASM_PATCHLEVEL__ %d
231 if ($version{snapshot
}) {
232 printf "%%define __NASM_SNAPSHOT__ %d\n", $version{snapshot
};
235 printf <<'END', @version{'id','_line'};
236 %%define __NASM_VERSION_ID__ 0%08Xh
237 %%define __NASM_VER__ "%s"
245 my @rep = @version{qw{
256 no warnings
'uninitialized';
257 sprintf <<'END', @rep;
258 s/@@NASM_MAJOR@@/%d/g
259 s/@@NASM_MINOR@@/%d/g
260 s/@@NASM_SUBMINOR@@/%d/g
261 s/@@NASM_PATCHLEVEL@@/%d/g
262 s/@@NASM_SNAPSHOT@@/%d/g
263 s/@@NASM_VERSION_ID@@/%d/g
264 s/@@NASM_VERSION_XID@@/%s/g
266 s/@@NASM_MANGLED_VER@@/%s/g
274 return sprintf <<END, @version{'_line','major','minor','subminor','patchlevel'};
279 NASM_PATCHLEVEL_VER=%d
287 sed
=> 'strings for sed command',
288 mac
=> 'strings for nasm macros',
289 h
=> 'strings for headers',
290 make
=> 'strings for makefiles',
291 dump => 'dump of program data'
295 if( $cmd and $help{$cmd} ){
298 return "$0 [help] <[ sed | mac | h | make | dump ]>";