e70152e44cc66cc599ff6b699eb8adc07f3e656a kent Sat May 24 21:09:34 2014 -0700 Adding Copyright NNNN Regents of the University of California to all files I believe with reasonable certainty were developed under UCSC employ or as part of Genome Browser copyright assignment. diff --git src/lib/quotedP.c src/lib/quotedP.c index 1342a4d..7dbd111 100644 --- src/lib/quotedP.c +++ src/lib/quotedP.c @@ -1,114 +1,117 @@ +/* Copyright (C) 2011 The Regents of the University of California + * See README in this or parent directory for licensing information. */ + #include "common.h" #include "linefile.h" #include "dystring.h" #include "quotedP.h" char *quotedPrintableEncode(char *input) /* Use Quoted-Printable standard to encode a string. */ { struct dyString *dy = dyStringNew(0); size_t i=0,l=strlen(input); int width = 0; for (i=0; i < l; ++i) { char c = input[i]; switch (c) { case '=': case '\t': case '\r': case '\n': case ' ': dyStringAppendC(dy, '='); dyStringPrintf(dy, "%2x", c); width += 3; break; default: dyStringAppendC(dy, c); ++width; } if (width > 72) { dyStringAppendC(dy, '='); dyStringAppendC(dy, '\n'); width = 0; } } /* add terminator to prevent extra newline */ if (lastChar(dy->string) != '=') dyStringAppendC(dy, '='); return dyStringCannibalize(&dy); } boolean quotedPCollapse(char *line) /* Use Quoted-Printable standard to decode a string. * Return true if the line does not end in '=' * which indicate continuation. */ { size_t i=0,j=0,l=strlen(line); boolean result = lastChar(line) != '='; char c1 = ' ', c2 = ' '; while(i < l) { if (line[i] == '=') { if (i > (l-3)) break; /* not enough room left for whole char */ ++i; c1 = line[i++]; c2 = line[i++]; c1 = toupper(c1); c2 = toupper(c2); if (isdigit(c1)) c1 -= 48; else c1 -= 55; if (isdigit(c2)) c2 -= 48; else c2 -= 55; line[j++] = (c1 * 16) + c2; } else { line[j++] = line[i++]; } } line[j] = 0; /* terminate line */ return result; } char *quotedPrintableDecode(char *input) /* Use Quoted-Printable standard to decode a string. Return decoded * string which will be freeMem'd. */ { size_t inplen = strlen(input); char *result = (char *)needMem(inplen+1); size_t j=0; char *line = NULL; int size = 0; int i = 0; boolean newLine = FALSE; struct lineFile *lf = lineFileOnString("", TRUE, cloneString(input)); while (lineFileNext(lf, &line, &size)) { newLine = quotedPCollapse(line); size = strlen(line); for (i = 0; i < size; ) result[j++] = line[i++]; if (newLine) result[j++] = '\n'; } lineFileClose(&lf); /* frees cloned string */ result[j] = 0; /* terminate text string */ return result; }