From: Vlad S. <ser...@us...> - 2005-04-02 20:29:55
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25568/nsd Modified Files: tclmisc.c uuencode.c Log Message: modified uuencode/decode to support string buffers any size and be compatible with GNU uuencode, i.e. wrapping lines to be 60 chars Index: tclmisc.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tclmisc.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** tclmisc.c 6 Mar 2005 22:48:27 -0000 1.2 --- tclmisc.c 2 Apr 2005 20:29:46 -0000 1.3 *************** *** 358,363 **** NsTclHTUUEncodeObjCmd(ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj **objv) { - char bufcoded[1 + (4 * 48) / 2]; char *string; int nbytes; --- 358,363 ---- NsTclHTUUEncodeObjCmd(ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj **objv) { char *string; + char *result; int nbytes; *************** *** 367,377 **** } string = Tcl_GetStringFromObj(objv[1], &nbytes); ! if (nbytes > 48) { ! Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "invalid string \"", ! string, "\": must be less than 48 characters", NULL); ! return TCL_ERROR; ! } ! Ns_HtuuEncode((unsigned char *) string, (size_t)nbytes, bufcoded); ! Tcl_SetResult(interp, bufcoded, TCL_VOLATILE); return TCL_OK; } --- 367,373 ---- } string = Tcl_GetStringFromObj(objv[1], &nbytes); ! result = ns_malloc(1 + (4 * nbytes) / 2); ! Ns_HtuuEncode((unsigned char *) string, (size_t)nbytes, result); ! Tcl_SetResult(interp, result, (Tcl_FreeProc *) ns_free); return TCL_OK; } Index: uuencode.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/uuencode.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** uuencode.c 16 Feb 2005 08:39:33 -0000 1.1.1.1 --- uuencode.c 2 Apr 2005 20:29:46 -0000 1.2 *************** *** 93,97 **** * Side effects: * Encoded characters are placed in output which must be ! * large enough for the result, i.e., (1 + (len * 4) / 3) * bytes. * --- 93,97 ---- * Side effects: * Encoded characters are placed in output which must be ! * large enough for the result, i.e., (1 + (len * 4) / 2) * bytes. * *************** *** 103,107 **** { register unsigned char *p, *q; ! register int n; /* --- 103,107 ---- { register unsigned char *p, *q; ! register int n, line = 0; /* *************** *** 118,121 **** --- 118,130 ---- *q++ = ENC(p[2] & 077); p += 3; + line += 4; + /* + * Add wrapping newline to be compatible with GNU uuencode + */ + + if (line == 60) { + *q++ = '\n'; + line = 0; + } } *************** *** 162,167 **** Ns_HtuuDecode(char *input, unsigned char *output, int outputlen) { register unsigned char *p, *q; - register int len, n; --- 171,177 ---- Ns_HtuuDecode(char *input, unsigned char *output, int outputlen) { + register int n; + unsigned char buf[4]; register unsigned char *p, *q; *************** *** 175,198 **** /* - * Determine the maximum length of output bytes. - */ - - p = input; - while (pr2six[(int)(*p)] >= 0) { - ++p; - } - len = p - (unsigned char *) input; - - /* * Decode every four input bytes. */ p = input; q = output; ! for (n = len / 4; n > 0; --n) { ! *q++ = DEC(p[0]) << 2 | DEC(p[1]) >> 4; ! *q++ = DEC(p[1]) << 4 | DEC(p[2]) >> 2; ! *q++ = DEC(p[2]) << 6 | DEC(p[3]); ! p += 4; } --- 185,205 ---- /* * Decode every four input bytes. */ + n = 0; p = input; q = output; ! while (*p) { ! if (pr2six[(int)(*p)] >= 0) { ! buf[n++] = *p; ! if (n == 4) { ! *q++ = DEC(buf[0]) << 2 | DEC(buf[1]) >> 4; ! *q++ = DEC(buf[1]) << 4 | DEC(buf[2]) >> 2; ! *q++ = DEC(buf[2]) << 6 | DEC(buf[3]); ! n = 0; ! } ! } ! p++; } *************** *** 201,210 **** */ - n = len % 4; if (n > 1) { ! *q++ = DEC(p[0]) << 2 | DEC(p[1]) >> 4; } if (n > 2) { ! *q++ = DEC(p[1]) << 4 | DEC(p[2]) >> 2; } if ((q - output) < outputlen) { --- 208,216 ---- */ if (n > 1) { ! *q++ = DEC(buf[0]) << 2 | DEC(buf[1]) >> 4; } if (n > 2) { ! *q++ = DEC(buf[1]) << 4 | DEC(buf[2]) >> 2; } if ((q - output) < outputlen) { |