コマンドライン引数を分解して配列と辞書に取得する。ヘルプファイル書いてライブラリする予定。需要はあんまりなさそうだけど、前例もないみたいなので。
コマンドライン引数を分解して配列と辞書に取得する。ヘルプファイル書いてライブラリする予定。需要はあんまりなさそうだけど、前例もないみたいなので。
#runtime "hsp3cl" #cmpopt varinit 1 #include "Dictionary.as" #ifndef CmdParser #ifndef CmdParserAliasOff #define global cmdRefArray refArray@CmdParser #define global cmdRef ref@CmdParser #define global cmdIsDefault isDefault@CmdParser #define global cmdRefArgs refArgs@CmdParser #define global cmdRefFlgs refFlgs@CmdParser #define global cmdRefOpts refOpts@CmdParser #endif #module CmdParser __args,__flgs,__opts,__error,__isDefault dim __defaultFlgKeys dim __defaultOptKeys sdim __defaultArgs dimtype __defaultOpts,vartype("struct") dimtype __defaultFlgs,vartype("struct") #define refArray(%1) sdim %1: __refArray@CmdParser %1 #deffunc local __refArray array args cmd=dir_cmdline cmd=strtrim(cmd,,' ') dquot=""" while 0<=instr(cmd,,dquot): dquot+=";": wend space=" " while 0<=instr(cmd,,space): space+=";": wend strrep cmd,"\\\"",dquot sdim dbreaks split cmd,"\"",dbreaks cmd="" foreach dbreaks if cnt\2=0 { while 0<=instr(dbreaks(cnt),," ") strrep dbreaks(cnt)," "," " wend } else { strrep dbreaks(cnt)," ",space } cmd+=dbreaks(cnt) loop split cmd," ",args foreach args strrep args(cnt),space," " strrep args(cnt),dquot,"\"" loop return #modcfunc local isDefault return __isDefault #define ref(%1,%2=__defaultArgs,%3=__defaultFlgs,%4=__defaultOpts) \ refArgs@cmdParser %1,%2: refFlgs@cmdParser %1,%3: refOpts@cmdParser %1,%4 #define refArgs(%1,%2) sdim %2: __refArgs@CmdParser %1,%2 #modfunc local __refArgs array _args foreach __args: _args.cnt=__args.cnt: loop: return #define refFlgs(%1,%2) dimtype %2,vartype("struct"): __refFlgs@CmdParser %1,%2 #modfunc local __refFlgs var _flgs _flgs=__flgs: return #define refOpts(%1,%2) dimtype %2,vartype("struct"): __refOpts@CmdParser %1,%2 #modfunc local __refOpts var _opts _opts=__opts: return #define new(%1,%2=__defaultFlgKeys,%3=__defaultOptKeys) \ dimtype %1,vartype("struct"): newmod %1,CmdParser,%2,%3 #modinit array flgKeys,array optKeys __argsLength=0 __args=0 new@Dictionary __flgs,"int" if vartype("str")=vartype(flgKeys) { foreach flgKeys: add@Dictionary __flgs,flgKeys.cnt,0: loop} new@Dictionary __opts,"str" errMes="" rtCount=0 refArray args if length(args)=1 & args="" { __isDefault=1 return errMes } i=rtCount repeat:if length(args)<=i: break arg=args(i) if vartype("str")=vartype(flgKeys) { for n,,length(flgKeys) key=flgKeys(n) if arg="-"+strmid(key,0,1) | arg="--"+key { set@Dictionary __flgs,key,1 i++:continue } next } if vartype("str")=vartype(optKeys) { for n,,length(optKeys) key=optKeys(n) if arg="-"+strmid(key,0,1) | arg="--"+key { i++ if containsKey@Dictionary(__opts,key) { errMes=strf("オプション「--%s」が複数入力されています。",key) break } if length(args)<=i { errMes=strf("オプション「--%s」に対応する値が入力されていません。",key) break } add@Dictionary __opts,key,args(i) i++:continue } next } if strmid(arg,0,1)="-"{ errMes=strf("オプション「%s」は定義されていません。",arg) break } __args(__argsLength)=arg __argsLength++ i++ loop return errMes #global #endif *main dimtype obj,vartype("struct") flgKeys="help","version" optKeys="alpha","beta","gamma","alpaca" new@cmdParser cmd,flgKeys,optKeys if ""!refstr { mes "{\"hsp3\":{\"refstr\":\""+refstr+"\"}}" end } if cmdIsDefault(cmd) { mes "{\"hsp3\":\"デフォルトオプションで実行しています。\"}" end } cmdRef cmd,args,flgs,opts q="\"" if vartype("int")!=vartype(args): joinArgs=q+dcJoinArray(args,"\",\"")+q: else: joinArgs="" if 0<dcCount(flgs): q="\"": else: q="" joinFlgs=q+dcJoinDict(flgs,"\":",",\"") strrep joinFlgs,":1",":true" strrep joinFlgs,":0",":false" if 0<dcCount(opts): q="\"": else: q="" joinOpts=q+dcJoinDict(opts,"\":\"","\",\"")+q mes strf("{\"hsp3\":{\"args\":[%s],\"flgs\":{%s},\"opts\":{%s}}}",joinArgs,joinFlgs,joinOpts)