ref: 062038c04a1cb9b7b161b670c5a3a948aaed42d1
dir: /mbld/fsel.myr/
use std use "opts.use" pkg bld = type syssel(@a) = struct file : byte[:] line : int targ : byte[:] _sysattrs : std.htab(byte[:], bool)# _match : std.htab(byte[:], int)# _best : std.htab(byte[:], @a)# ;; generic mksyssel : (f : byte[:], line : int, targ : byte[:] -> syssel(byte[:])#) generic sysseladd : (fsel : syssel(byte[:])#, file : byte[:] -> void) generic sysselfin : (fsel : syssel(byte[:])# -> byte[:][:]) ;; generic mksyssel = {file, line, targ var fsel fsel = std.mk([ .file = file, .line = line, .targ = targ, ._match = std.mkht(std.strhash, std.streq), ._best = std.mkht(std.strhash, std.streq), ._sysattrs = std.mkht(std.strhash, std.streq), ]) addsysattrs(fsel._sysattrs) -> fsel } generic sysseladd = {fsel, f var basename, attrs var nmatch, curbest var attrlist, i match std.strfind(f, "+") | `std.Some idx: basename = f[:idx] match std.strrfind(f[idx+1:], ".") | `std.Some j: attrs = f[idx+1:][:j] | `std.None: std.fatal("unrecognized type for file {}\n", f) ;; | `std.None: match std.strrfind(f, ".") | `std.None: std.fatal("unrecognized type for file {}\n", f) | `std.Some idx: basename = f[:idx] attrs = "" ;; ;; nmatch = 0 attrlist = std.strsplit(attrs, "-") for i = 0; i < attrlist.len; i++ if std.hthas(fsel._sysattrs, attrlist[i]) nmatch++ else nmatch = -1 break ;; ;; std.slfree(attrlist) curbest = std.htgetv(fsel._match, basename, -1) if curbest < nmatch std.htput(fsel._match, basename, nmatch) std.htput(fsel._best, basename, f) ;; } generic sysselfin = {fsel var keys, nmatch, ret keys = std.htkeys(fsel._match) ret = [][:] for k in keys nmatch = std.htgetv(fsel._match, k, -1) if nmatch == -1 std.fatal("{}:{}: target {}, no applicable file for '{}'\n", fsel.file, fsel.line, fsel.targ, k) ;; ret = std.slpush(ret, std.htgetv(fsel._best, k, "")) ;; std.htfree(fsel._match) std.htfree(fsel._best) std.htfree(fsel._sysattrs) -> ret } const addsysattrs = {sa var attrs match opt_sys | "freebsd": attrs = ["freebsd", "posixy"][:] | "osx": attrs = ["osx", "posixy"][:] | "linux": attrs = ["linux", "posixy"][:] | "plan9": attrs = ["plan9"][:] | unknown: std.fatal("unknown systemx \"{}\"\n", unknown) ;; for a in attrs std.htput(sa, a, true) ;; match opt_arch | "x64": attrs = ["x64"][:] | unknown: std.fatal("unknown architecture {}\n", unknown) ;; for a in attrs std.htput(sa, a, true) ;; }