Index: generic/gentclAPI.tcl =================================================================== diff -u -r1e14e709ba184c6daf7a2f94605a2cff65d7706c -r7a6e32605412db15c6b9a1d61ce0a9dfd92bfbf6 --- generic/gentclAPI.tcl (.../gentclAPI.tcl) (revision 1e14e709ba184c6daf7a2f94605a2cff65d7706c) +++ generic/gentclAPI.tcl (.../gentclAPI.tcl) (revision 7a6e32605412db15c6b9a1d61ce0a9dfd92bfbf6) @@ -16,15 +16,17 @@ proc createconverter {type argname} { set name [convertername $type $argname] - if {[info exists ::created($name)]} { + if {[info exists ::createdConverter($name)]} { return "" } - set ::created($name) 1 set domain [split $type |] set opts "static CONST char *opts\[\] = {\"[join $domain {", "}]\", NULL};" + set ::createdConverter($name) "ConvertTo${name}, \"$type\"" set enums [list ${name}NULL] foreach d $domain {lappend enums $name[string totitle [string map [list - _] $d]]Idx} subst { +enum ${name}Idx {[join $enums {, }]}; + static int ConvertTo${name}(Tcl_Interp *interp, Tcl_Obj *objPtr, NsfParam CONST *pPtr, ClientData *clientData, Tcl_Obj **outObjPtr) { int index, result; @@ -34,7 +36,6 @@ *outObjPtr = objPtr; return result; } -enum ${name}Idx {[join $enums {, }]}; } } @@ -46,6 +47,7 @@ "" {set type NULL} default {set type $(-type)} } + set flags [expr {$(-required) ? "NSF_ARG_REQUIRED" : "0"}] set argName $(-argName) switch -glob $type { "NULL" {set converter String} @@ -61,6 +63,7 @@ set converter [convertername $type $(-argName)] append ::converter [createconverter $type $(-argName)] set (-argName) $type + append flags |NSF_ARG_IS_ENUMERATION } } # this does not work, since initializer element is not constant. @@ -70,7 +73,7 @@ # } else { # set default "" # } - lappend l "{\"$argName\", $(-required), $(-nrargs), ConvertTo$converter}" + lappend l "{\"$argName\", $flags, $(-nrargs), ConvertTo$converter}" } join $l ",\n " } @@ -274,15 +277,26 @@ append stubDecls $stubDecl } - puts $::converter puts { typedef struct { CONST char *methodName; Tcl_ObjCmdProc *proc; int nrParameters; NsfParam paramDefs[12]; } methodDefinition; + } + puts $::converter + set entries [list] + foreach c [array names ::createdConverter] {lappend entries "\{$::createdConverter($c)\}"} + puts [subst { +static enumeratorConverterEntry enumeratorConverterEntries\[\] = { + [join $entries ",\n "], + {NULL, NULL} +}; + }] + + puts { static int ArgumentParse(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], NsfObject *obj, Tcl_Obj *procName, NsfParam CONST *paramPtr, int nrParameters, int doCheck,