static int wyrm_huffCommand(ClientData clientData,Intr intr,int N,Tcl_Obj *const P[]) {
chars p,prime; Obj R; int nstates = 16;
Tcl_ResetResult(intr);
#ifdef TESTING
if (streq(Tcl_GetStringFromObj(P[1],0),"splash")) {
Tcl_SetResult(intr,splashgif,TCL_STATIC);
return TCL_OK;
}
#endif
if (N>=3 && streq(Tcl_GetStringFromObj(P[1],0),"-n")) {
if (Tcl_GetIntFromObj(intr,P[2],&nstates)!=TCL_OK)
return TCL_ERROR;
P+=2; N-=2;
}
if (N!=3 && N!=4) {
usage:
Tcl_AppendResult(intr,"usage: huffman compress|expand <string> [<prime>]",0);
return TCL_ERROR;
}
prime = N==4 ? Tcl_GetStringFromObj(P[3],0) : 0;
p = Tcl_GetStringFromObj(P[1],0);
if (stribegins("c",p))
R = wyrm_huffCompressObj(P[2],nstates,prime);
else if (stribegins("e",p))
R = wyrm_huffExpandObj(P[2],nstates,prime);
else {
Tcl_AppendResult(intr,"expected 'compress' or 'expand': ",p,"\n",0); goto usage;
}
Tcl_SetObjResult(intr,R); decr(R); return TCL_OK;
}
int wyrm_huffCommandInit(Intr intr) {
char package[] = "namespace eval ::wyrm {namespace export huffman}\n";
<Assert types are large enough>
Tcl_CreateObjCommand(intr,"::wyrm::huffman",wyrm_huffCommand,0,0);
return Tcl_Eval(intr,package);
}
|