chiark / gitweb /
macroisation, checkin before perlgen
[chiark-tcl.git] / hbytes / hbytes.c
index 99bddfe986acb222f953b40d9dbd5fecdd1217fe..d4a33f5082c056a1df90a0464e7323c5138cb1cf 100644 (file)
@@ -104,24 +104,76 @@ static Tcl_Obj *hb_getvar(Tcl_Interp *ip, Tcl_Obj *varname) {
   return value;
 }
 
-static int hc_bin(ClientData cd, Tcl_Interp *ip, int objc,
-                 Tcl_Obj *const *objv) {
-  Tcl_Obj *varname, *value, *result;
+HC_DEFINE(raw2h) {
+  HC_DECLS;
+  Tcl_Obj *raw, *value;
   const char *str;
   int l;
 
+  HC_ARG_O(raw);
+  HC_ARGS_E;
+  str= Tcl_GetStringFromObj(raw,&l);
+  value= hbytes_set(0,str,l);
+  Tcl_SetObjResult(ip,value);
+  HC_FINI;
+}
+
+HC_DEFINE(h2raw) {
+  Tcl_Obj *value, *result;
+  
+  HC_ARG_H(value);
+  HC_ARGS_E;
+  result= Tcl_NewStringObj(HBYTES(value)->start, HBYTES_LEN(value));
+  Tcl_SetObjResult(ip,result);
+  HC_FINI;
+}
+
+HC_DEFINE(pkcs5) {
+  typedef struct {
+    const char *spec;
+    int pad, algname;
+  } PadKindInfo;
+  static const PadKindInfo padkindinfos[0]= {
+    { "pa", 1, 1 },
+    { "pn", 1, 0 },
+    { "ua", 0, 1 },
+    { "un", 0, 0 },
+    { 0 }
+  };
+
+  HC_DECLS_HBV;
+  Tcl_Obj *v;
+  int blocksize;
+  const PadKindInfo *pk;
+  const BlockCipherInfo *bc;
+
+  HC_ARG_ENUM(pk, padkindinfos);
+  HC_ARG_HBV;
+  if (!pk->algname) HC_ARG_INTRANGE(blocksize, 1,255);
+  else { HC_ARG_ENUM(bc, blockciphers); blocksize= bc->blocksize; }
+  HC_ARGS_E;
+
+  /* do nothing :-) */
+
+  HC_FINI_HBV;
+}
+  
+static int hc_raw2h(ClientData cd, Tcl_Interp *ip, int objc,
+                   Tcl_Obj *const *objv) {
+  
+  Tcl_Obj *varname, *value, *result;
+
   varname= objv[0];
   switch (objc) {
   case 1:
     value= hb_getvar(ip,varname);  if (!value) return TCL_ERROR;
-    result= Tcl_NewStringObj(HBYTES(value)->start, HBYTES_LEN(value));
     assert(result);
     Tcl_SetObjResult(ip,result);
     return TCL_OK;
   case 2:
     value= objv[1];
-    str= Tcl_GetStringFromObj(value,&l);
-    value= hbytes_set(0,str,l);
+      HC_MINARGS(1);
+
     value= Tcl_ObjSetVar2(ip,varname,0, value, TCL_LEAVE_ERR_MSG);
     if (!value) return TCL_ERROR;
     Tcl_ResetResult(ip);
@@ -136,8 +188,14 @@ typedef struct {
   Tcl_ObjCmdProc *func;
 } SubCommand;
 
+#define SUBCOMMANDS                            \
+    DO(raw2h)                                  \
+    DO(h2raw)                                  \
+    DO(pkcs5)
+
 static const SubCommand subcommands[] = {
-  { "bin", 1, 2, hc_bin },
+#define DO(c) { #c, hc_##c },
+  SUBCOMMANDS
   { 0 }
 };