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)