+/*
+ * do_htmlToken
+ */
+int do_htmlToken (ClientData clientData, Tcl_Interp *interp,
+ int argc, char **argv)
+{
+ const char *src;
+ char *tmp_buf = NULL;
+ int tmp_size = 0;
+ int r;
+
+ if (argc != 4)
+ {
+ interp->result = "wrong # args: should be"
+ " \"htmlToken var list command\"";
+ return TCL_ERROR;
+ }
+ src = argv[2];
+ while (*src)
+ {
+ const char *src1;
+
+ if (*src == ' ' || *src == '\t' || *src == '\n' ||
+ *src == '\r' || *src == '\f')
+ {
+ src++;
+ continue;
+ }
+ src1 = src + 1;
+ if (*src == '<')
+ {
+ while (*src1 != '>' && *src1 != '\n' ** src1)
+ src1++;
+ if (*src1 == '>')
+ src1++;
+ }
+ else
+ {
+ while (*src1 != '<' && *src1)
+ src1++;
+ }
+ if (src1 - src >= tmp_size)
+ {
+ free (tmp_buf);
+ tmp_size = src1 - src + 256;
+ tmp_buf = ir_tcl_malloc (tmp_size);
+ }
+ memcpy (tmp_buf, src, src1 - src);
+ tmp_buf[src1-src] = '\0';
+ Tcl_SetVar (interp, argv[1], tmp_buf, 0);
+ r = Tcl_Eval (interp, argv[3]);
+ if (r != TCL_OK && r != TCL_CONTINUE)
+ break;
+ src = src1;
+ }
+ if (r == TCL_CONTINUE)
+ r = TCL_OK;
+ free (tmp_buf);
+ return r;
+}
+