/* * HP 54600 series oscilloscope printer image converter * * 1997-01-17 Kouichi Hirabayashi */ #if 0 HP 54600 シリーズの「PRINT?」コマンドで読み出したデータを標準入力から読んで、 PBM 形式のデータを標準出力の書き出します。 #endif #include int width; int height; unsigned char img[32000]; main(argc, argv) char **argv; { getimg(stdin); pbmImage(stdout); return 0; } getimg(fp) FILE *fp; { int c, dots, bytes, i, n, p; bytes = n = p = 0; while ((c = fgetc(fp)) != EOF) { if (c == '\033') { if ((c = fgetc(fp)) != '*') error("unexpected sequence", (char *)0); if ((c = fgetc(fp)) == 'r') { if ((c = fgetc(fp)) == 'A') ; /* start graphics */ else if (c == 'B') ; /* end graphics */ else if ('0' <= c && c <= '9') { for (n = 0; '0' <= c && c <= '9'; ) { n = n * 10 + c - '0'; c = fgetc(fp); } if (c == 'S') dots = n; else error("illegal ESC * sequence (%d)", c); } } else if (c == 'b') { if ((c = fgetc(fp)) < '0' || '9' < c) error("illegal ESC * b sequence (%d)", c); for (n = 0; '0' <= c && c <= '9'; ) { n = n * 10 + c - '0'; c = fgetc(fp); } if (c == 'W') { if (bytes == 0) bytes = n; else if (bytes != n) fprintf(stderr, "Warning: irregular line (%d)(%d)\n", bytes, n); for (i = 0; i < n; i++) img[p++] = fgetc(fp); } else error("illegal ESC * sequence (%d)", c); } } else if (c == '\n') break; else error("non graphics data (%d)", c); } fclose(fp); width = bytes * 8; height = p / bytes; } pbmImage(fp) FILE *fp; { char tmps[80]; int n; /* PBM RAWBITS format */ fwrite("P4\n", sizeof(char), 3, fp); sprintf(tmps, "%d %d\n", width, height); fwrite(tmps, sizeof(char), strlen(tmps), fp); n = (width >> 3) * height; if (fwrite(img, sizeof(char), n, fp) != n) fprintf(stderr, "file write errormin pbmImage()\n"); return 0; } error(s, t) char *s, *t; { fprintf(stderr, s, t); fprintf(stderr, "\n"); exit(1); }