void run() { Vector screenSize(640+2*8, 400+2*8); Vector size = screenSize*Vector(5, 8); Bitmap<SRGB> output(size); output.fill(SRGB(0, 0, 0)); for (int y = 0; y < size.y; ++y) { int yMaj = y/screenSize.y; int yMin = y%screenSize.y; static const int portValueTable[8] = { 0x1a00, 0x1e00, 0x0a00, 0x0a10, 0x0a20, 0x0a30, 0x0e20, 0x0e30}; int overscan = ((yMin - 8)/12) & 0x0f; int portValues = portValueTable[yMaj] | overscan; bool bpp1 = ((portValues & 0x1000) != 0); bool bw = ((portValues & 0x0400) != 0); bool backGroundI = ((portValues & 0x10) != 0); bool colorSel = ((portValues & 0x20) != 0); int pal[4]; pal[0] = overscan; pal[1] = 2; pal[2] = 4; pal[3] = 6; if (colorSel || bw) { pal[1] = 3; pal[3] = 7; } if (colorSel && !bw) pal[2] = 5; if (backGroundI) { pal[1] += 8; pal[2] += 8; pal[3] += 8; } char topLine[40]; memcpy(topLine, " 0 1 2 3 4 5 6 7 8 9 A B C D E F ", 40); topLine[0] = nybble(portValues >> 12); topLine[1] = nybble(portValues >> 8); topLine[2] = nybble(portValues >> 4); topLine[3] = nybble(portValues); for (int x = 0; x < screenSize.x; ++x) { if (yMin < 8) { char ch = topLine[x/16]; // TODO continue; } int pattern = (x - 8)/40; if (x < 8 || x >= 640 + 8) pattern = 0; } } RawFileFormat raw(size); raw.save(output, File("chart.raw")); }
static void decode(char *t) { char *s; for (s=t; *s; s++) { if (*s != '+') { *t++ = *s; continue; } if (s[1] == 0 || s[2] == 0) continue; *t++ = nybble(s[1]) * 16 + nybble(s[2]); s += 2; } *t=0; }
static uint8_t hex(const uint8_t *data, uint8_t *crc) { uint8_t val = (nybble(data[0]) << 4) | nybble(data[1]); *crc += val; return val; }
static void checksign(struct mimestack **stack, int *iseof, struct header *h, FILE *fpin, FILE *fpout, int argc, char **argv) { char buf[BUFSIZ]; struct header *h2; char signed_content[TEMPNAMEBUFSIZE]; char signature[TEMPNAMEBUFSIZE]; int signed_file, signature_file; FILE *signed_file_fp, *signature_file_fp; int clos_flag; int need_nl, check_boundary; struct mimestack *b=0; struct mime_header *mh; int qpdecode=0; signed_file=mimegpg_tempfile(signed_content); if (signed_file < 0 || (signed_file_fp=fdopen(signed_file, "w+")) == 0) { if (signed_file > 0) { close(signed_file); unlink(signed_content); } perror("open"); exit(1); } noexec(signed_file_fp); find_boundary(stack, iseof, fpin, NULL, 0); if (*iseof) return; need_nl=0; check_boundary=1; while (!*iseof) { const char *p; if (fgets(buf, sizeof(buf), fpin) == NULL) { *iseof=1; continue; } if (check_boundary && (b=is_boundary(*stack, buf, &clos_flag)) != 0) break; if (need_nl) fprintf(signed_file_fp, "\r\n"); for (p=buf; *p && *p != '\n'; p++) putc(*p, signed_file_fp); need_nl=check_boundary= *p != 0; } if (my_rewind(signed_file_fp) < 0) { perror(signed_content); fclose(signed_file_fp); unlink(signed_content); exit(1); } if (clos_flag) { fclose(signed_file_fp); unlink(signed_content); if (b) pop_mimestack_to(stack, b); find_boundary(stack, iseof, fpin, fpout, 1); return; } h=read_headers(stack, iseof, fpin, fpout, 0); if (!h || !(h2=find_header(h, "content-type:"))) { fclose(signed_file_fp); unlink(signed_content); if (!*iseof) find_boundary(stack, iseof, fpin, fpout, 1); return; } mh=parse_mime_header(h2->header+sizeof("content-type:")-1); if (!mh) { perror("malloc"); free_header(h); fclose(signed_file_fp); unlink(signed_content); exit(1); } if (!mh || strcasecmp(mh->header_name, "application/pgp-signature")) { if (!mh) free_mime_header(mh); free_header(h); fclose(signed_file_fp); unlink(signed_content); if (!*iseof) find_boundary(stack, iseof, fpin, fpout, 1); return; } free_mime_header(mh); /* ** In rare instances, the signature is qp-encoded. */ if ((h2=find_header(h, "content-transfer-encoding:")) != NULL) { mh=parse_mime_header(h2->header +sizeof("content-transfer-encoding:")-1); if (!mh) { perror("malloc"); free_header(h); fclose(signed_file_fp); unlink(signed_content); exit(1); } if (strcasecmp(mh->header_name, "quoted-printable") == 0) qpdecode=1; free_mime_header(mh); } free_header(h); signature_file=mimegpg_tempfile(signature); if (signature_file < 0 || (signature_file_fp=fdopen(signature_file, "w+")) == 0) { if (signature_file > 0) { close(signature_file); unlink(signature); } fclose(signed_file_fp); unlink(signed_content); perror("open"); exit(1); } while (!*iseof) { const char *p; if (fgets(buf, sizeof(buf), fpin) == NULL) { *iseof=1; continue; } if ((b=is_boundary(*stack, buf, &clos_flag)) != 0) break; for (p=buf; *p; p++) { int n; if (!qpdecode) { putc(*p, signature_file_fp); continue; } if (*p == '=' && p[1] == '\n') break; if (*p == '=' && p[1] && p[2]) { n=nybble(p[1]) * 16 + nybble(p[2]); if ( (char)n ) { putc((char)n, signature_file_fp); p += 2; } p += 2; continue; } putc(*p, signature_file_fp); /* If some spits out qp-lines > BUFSIZ, they deserve ** this crap. */ } } fflush(signature_file_fp); if (ferror(signature_file_fp) || fclose(signature_file_fp)) { unlink(signature); fclose(signed_file_fp); unlink(signed_content); perror("open"); exit(1); } dochecksign(*stack, signed_file_fp, fpout, signed_content, signature, argc, argv); fclose(signed_file_fp); unlink(signature); unlink(signed_content); fprintf(fpout, "\n--%s--\n", b->boundary); while (!clos_flag) { if (fgets(buf, sizeof(buf), fpin) == NULL) { *iseof=1; break; } if (!(b=is_boundary(*stack, buf, &clos_flag))) clos_flag=0; } if (b) pop_mimestack_to(stack, b); if (iseof) return; }
unsigned char unhex(const char *data) { return (nybble(data[0]) << 4) | nybble(data[1]); }