HSPでコマンドラインを解析して取得。

コマンドライン引数を分解して配列と辞書に取得する。ヘルプファイル書いてライブラリする予定。需要はあんまりなさそうだけど、前例もないみたいなので。

コマンドライン引数を分解して配列と辞書に取得する。ヘルプファイル書いてライブラリする予定。需要はあんまりなさそうだけど、前例もないみたいなので。

  • タグ:
  • タグはありません
#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="&nbsp;"
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)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX