/* debpr.c */ #include #include #include #include "aman.h" #define PRINTER_LINE_LEN 400 #define DGESHIM_BASE 176 #define NIKUD_LINE_SPACING 12 #define TEXT_LINE_BASE 72 #define NIKUD_FILE "D:\PRINTEIN." FILE *deb_Printer; extern FILE *scr_in_file; int deb_LineSpacing; char deb_InitDebPr(void); int deb_GetLine(char *, int); void deb_PrintLine(char *, int); int deb_EscSize(char **); void deb_DebPr(void) { char line[PRINTER_LINE_LEN]; int Len; if (deb_InitDebPr() == NO) return; if (SendNikudFile(searchpath(NIKUD_FILE), deb_Printer) == NO) /* Initiate the printer with nikud & dgeshim */ return; while ((Len = deb_GetLine(line, sizeof line)) >= 0) { if (line[0] == '\f' && feof(scr_in_file)) fputc ('\f', deb_Printer); else deb_PrintLine(line, Len); } fprintf (deb_Printer, "%c2", ESC); /* Printer default line spacing */ /* fprintf (deb_Printer, "\f");*/ fclose(deb_Printer); } char deb_InitDebPr (void) { deb_Printer = fopen ("PRN", "wb+"); /* deb_Printer = fopen ("t.t", "wb");*/ if (deb_Printer == NULL) { scr_error(YES, "Can't print on printer"); return NO; } deb_LineSpacing=TEXT_LINE_BASE; return YES; } int deb_GetLine (char *line, int n) { char *p=line, cr=NO, neol = YES; if feof (scr_in_file) return -1; while ( ! feof(scr_in_file) && neol && --n > 0) { *p = scr_get_char(); if (*p == 0xff) return 0; else if (*p == '\r') cr = YES; else if (*p == '\n' && cr) neol = NO; else if (cr) cr = NO; p++; } if ( ! neol) p -= 2; *p = NULL; return (int)(p - line); } void deb_PrintLine (char *line, int Len) { char nikud_line[PRINTER_LINE_LEN], *p_nikud=nikud_line; char out_line[PRINTER_LINE_LEN], *p_out=out_line; char *p_end = line + Len; char *p, dagesh=NO, nikud=0, holam=0, has_nikud=NO; int count=0, n; if (*line == '\f') { fputc('\f', deb_Printer); line++; } for (p=line; p < p_end; p++) { if (*p == 18) /* Cancel condenced mode */ continue; if (*p == ESC) { n = deb_EscSize(&p); if (n > 0) { memcpy (p_out, p, n); p_out += n; } p += (n-1); } else if (*p == DAGESH) { dagesh = YES; count++; } else if (is_nikud(*p)) { has_nikud = YES; if (*p == HOLAM) holam = *p; else nikud = *p; count++; } else { if (dagesh) { *p += (DGESHIM_BASE-'€'); dagesh = NO; } if (holam) { *p_out++ = HOLAM; *p_out++ = '\b'; holam = 0; } if (nikud) { *p_nikud++ = nikud; nikud = 0; } else *p_nikud++ = ' '; *p_out++ = *p; } } fprintf (deb_Printer, "%*s", count, ""); for (p=out_line; p < p_out; p++) fputc (*p, deb_Printer); if (has_nikud) fprintf (deb_Printer, "%c3%c", ESC, NIKUD_LINE_SPACING); else fprintf (deb_Printer, "%c3%c", ESC, deb_LineSpacing); fputs ("\r\n", deb_Printer); if (has_nikud) { fprintf (deb_Printer, "%*s", count, ""); for (p=nikud_line; p < p_nikud; p++) fputc (*p, deb_Printer); fprintf (deb_Printer, "%c3%c", ESC, deb_LineSpacing-NIKUD_LINE_SPACING); fputs ("\r\n", deb_Printer); } } int deb_EscSize (char **p) { int n; switch (*(*p+1)) { case 'C': case 'S': case '-': n = 3; break; case 'P': case 'G': case 'H': case 'T': n = 2; break; case 'J': deb_LineSpacing = TEXT_LINE_BASE + *(*p+2); *p += 3; n = 0; break; default: scr_fatal(YES, "ESC %c Not defined yet, please report bug", *(*p+1)); n = 2; break; } return n; }