コマンドライン引数を分解して配列と辞書に取得する。ヘルプファイル書いてライブラリする予定。需要はあんまりなさそうだけど、前例もないみたいなので。
コマンドライン引数を分解して配列と辞書に取得する。ヘルプファイル書いてライブラリする予定。需要はあんまりなさそうだけど、前例もないみたいなので。
#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,__isDefaultdim __defaultFlgKeysdim __defaultOptKeyssdim __defaultArgsdimtype __defaultOpts,vartype("struct")dimtype __defaultFlgs,vartype("struct")#define refArray(%1) sdim %1: __refArray@CmdParser %1#deffunc local __refArray array argscmd=dir_cmdlinecmd=strtrim(cmd,,' ')dquot="""while 0<=instr(cmd,,dquot): dquot+=";": wendspace=" "while 0<=instr(cmd,,space): space+=";": wendstrrep cmd,"\\\"",dquotsdim dbreakssplit cmd,"\"",dbreakscmd=""foreach dbreaksif cnt\2=0 {while 0<=instr(dbreaks(cnt),," ")strrep dbreaks(cnt)," "," "wend}else {strrep dbreaks(cnt)," ",space}cmd+=dbreaks(cnt)loopsplit cmd," ",argsforeach argsstrrep args(cnt),space," "strrep args(cnt),dquot,"\""loopreturn#modcfunc local isDefaultreturn __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 _argsforeach __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=0new@Dictionary __flgs,"int"if vartype("str")=vartype(flgKeys) {foreach flgKeys: add@Dictionary __flgs,flgKeys.cnt,0: loop}new@Dictionary __opts,"str"errMes=""rtCount=0refArray argsif length(args)=1 & args="" {__isDefault=1return errMes}i=rtCountrepeat:if length(args)<=i: breakarg=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,1i++: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++loopreturn errMes#global#endif*maindimtype obj,vartype("struct")flgKeys="help","version"optKeys="alpha","beta","gamma","alpaca"new@cmdParser cmd,flgKeys,optKeysif ""!refstr {mes "{\"hsp3\":{\"refstr\":\""+refstr+"\"}}"end}if cmdIsDefault(cmd) {mes "{\"hsp3\":\"デフォルトオプションで実行しています。\"}"end}cmdRef cmd,args,flgs,optsq="\""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,"\":\"","\",\"")+qmes strf("{\"hsp3\":{\"args\":[%s],\"flgs\":{%s},\"opts\":{%s}}}",joinArgs,joinFlgs,joinOpts)