Пример #1
0
static PyObject *dec85(FILE *fin, FILE *fout) {
	unsigned long tuple = 0;
	int c, count = 0;
	for (;;)
            switch (c = getc(fin)) {
            default:
                if (c < '!' || c > 'u')
                    return 
                    PyErr_Format(PyExc_ValueError, "decode85: bad character in ascii85 region: %#o\n", c);

                tuple += (c - '!') * pow85[count++];
                if (count == 5) {
                    wput(tuple, 4, fout);
                    count = 0;
                    tuple = 0;
                }
                break;
            case 'z':
                if (count != 0)
                    return 
                    PyErr_Format(PyExc_ValueError, "decode85: z inside ascii85 5-tuple\n");

                putc(0, fout);
                putc(0, fout);
                putc(0, fout);
                putc(0, fout);
                break;
            case '~':
                if (getc(fin) == '>') {
                    if (count > 0) {
                        count--;
                        tuple += pow85[count];
                        wput(tuple, count, fout);
                    }
                    c = getc(fin);
                    return NULL;
                }
                return 
                PyErr_Format(PyExc_ValueError, "decode85: ~ without > in ascii85 section\n");

            case '\n': case '\r': case '\t': case ' ':
            case '\0': case '\f': case '\b': case 0177:
                break;
            case EOF:
                return 
                PyErr_Format(PyExc_ValueError, "decode85: EOF inside ascii85 section\n");
            }
}
Пример #2
0
void decode85(FILE *fp, const char *file) {
	unsigned long tuple = 0;
	int c, count = 0;
	for (;;)
		switch (c = getc(fp)) {
		default:
			if (c < '!' || c > 'u') {
				fprintf(stderr, "%s: bad character in ascii85 region: %#o\n", file, c);
				exit(1);
			}
			tuple += (c - '!') * pow85[count++];
			if (count == 5) {
				wput(tuple, 4);
				count = 0;
				tuple = 0;
			}
			break;
		case 'z':
			if (count != 0) {
				fprintf(stderr, "%s: z inside ascii85 5-tuple\n", file);
				exit(1);
			}
			putchar(0);
			putchar(0);
			putchar(0);
			putchar(0);
			break;
		case '~':
			if (getc(fp) == '>') {
				if (count > 0) {
					count--;
					tuple += pow85[count];
					wput(tuple, count);
				}
				c = getc(fp);
				return;
			}
			fprintf(stderr, "%s: ~ without > in ascii85 section\n", file);
			exit(1);
		case '\n': case '\r': case '\t': case ' ':
		case '\0': case '\f': case '\b': case 0177:
			break;
		case EOF:
			fprintf(stderr, "%s: EOF inside ascii85 section\n", file);
			exit(1);
		}
}
/*
 * translate a filename
 */
void
isofntrans(const u_char *infn, int infnlen, u_char *outfn, u_short *outfnlen,
	int original, int casetrans, int assoc, int joliet_level)
{
	int fnidx = 0;
	const u_char *infnend = infn + infnlen;
	u_int16_t c;
	int sz;

	if (assoc) {
		*outfn++ = ASSOCCHAR;
		fnidx++;
	}

	for(; infn != infnend; fnidx += sz) {
		infn += isochar(infn, infnend, joliet_level, &c);

		if (casetrans && joliet_level == 0 && c >= 'A' && c <= 'Z')
			c = c + ('a' - 'A');
		else if (!original && c == ';') {
			if (fnidx > 0 && outfn[-1] == '.')
				fnidx--;
			break;
		}

		sz = wput(outfn, ISO_MAXNAMLEN - fnidx, c, joliet_level);
		if (sz == 0) {
			/* not enough space to write the character */
			if (fnidx < ISO_MAXNAMLEN) {
				*outfn = '?';
				fnidx++;
			}
			break;
		}
		outfn += sz;
	}
	*outfnlen = fnidx;
}