system/std.zusatz/1.7.3/src/FONTR16.ELA

Raw file
Back to index

PACKET fonts routines
(************************************************************************** 
***** Verwaltung der Schriftfontstabelle  **  Author : R. Nolting     *****
***** Benoetigt von allen Druckertreibern **  Version: 0.1 / 3.5.82   *****
*****                                     **  Version: 1.0 / 8.6.82   ***** 
*****                                     **  Version: 2.0 / 1. 8. 82 *****
***** Schrittweite in x und y in Tabelle  **  Version: 3.0 / 1. 9. 83 ***** 
***** Zeilenhoehe in cm                   **  Version: 3.1 / 2. 4. 84 *****
**************************************************************************)
 
    DEFINES 
             load font table,
             get font,
             list fonts,
             inch,
             current font number,
             lf height of current font,
             x factor per inch, 
             y factor per inch:

LET max fonts = 8;
LET max nr points = 4;
LET PRINTTYPE = STRUCT (INT x steps per inch, y steps per inch,
                        ROW max nr points INT point size,
                        TEXT name, pitch table, codetable);
ROW max fonts PRINTTYPE VAR font;
FILE VAR font file;
INT VAR font number := 1, point number := 1;
TEXT VAR record :=  " ",
         symb;
INT VAR i;
REAL CONST inch := 2.54;
 
INT PROC x factor per inch: 
  x step
END PROC x factor per inch;
 
INT PROC y factor per inch: 
  lf 
END PROC y factor per inch;
 
REAL PROC lf height of current font:
  real(point (point number)) * inch / real (lf)  (* 9.1.84 Nolting *)
END PROC lf height of current font;
 
INT PROC current font number: 
  font number 
END PROC current font number;
(*******************************************************************
*********  Setzen und Liefern von Schriftsaetzen              ******
*******************************************************************)
PROC init font:
FOR font number FROM 1 UPTO max fonts REP;
  lf := 1; 
  x step := 1; 
  FOR point number FROM 1 UPTO max nr points REP 
    point(point number) := 1; 
    PER;
  kode := "";
  name := "";
  pitch:= "";
  PER;
END PROC init font;
(******************************************************************)
 
PROC list fonts:
  line;
  FOR font number FROM 1 UPTO max fonts REP
   IF name <> "" AND name <> " "
       THEN put typ name 
       FI;
    line;
    PER;
  font number := 1; point number := 1;
. 
put typ name:
  put (font number); put (".");
  put ("'"); put (name); put ("'");
  IF length (pitch) > 1 
     THEN put ("proportional mit Blankbreite"); put (code (pitch SUB 32))
     ELSE put ("fest mit Blankbreite"); put (code (pitch));
     FI;
  put ("und Zeilenhoehe"); put (point (1));
END PROC list fonts;
 
BOOL PROC font is in table (TEXT CONST name of font):
  record := name of font;
  changeall (record, " ","");
  IF record = ""
     THEN font number := 1; TRUE
     ELSE search through the table
     FI
.
search through the table:
(* der Name des gewuenschten Types darf noch ein angehaengtes Attribut haben *)
  FOR font number FROM 1 UPTO max fonts REPEAT
    IF pos (record, name) = 1
       THEN LEAVE search through the table WITH TRUE
       FI;
    PER;
    font number := 1;
    FALSE
ENDPROC font is in table;
 
PROC get font (TEXT VAR name of font,
               TEXT VAR font pitch table, font code table,
               BOOL VAR success):
INT VAR lf size := 0;
  get font (name of font, lf size, 
            font pitch table, font code table, success); 
  replace (font pitch table, 10, code(lfsize)); 
END PROC get font; 
 
PROC get font (TEXT VAR name of font, INT VAR size,
               TEXT VAR font pitch table, font code table,
               BOOL VAR success):
  success := font is in table (name of font);
  name of font := name;
  (* hiermit wird eine Ueberpruefung 'alter Typ = neuer Typ'
     im aufrufenden Programm ermoeglicht *)
  font code table := kode;
  font pitch table := pitch;
  point number := max nr points;
  WHILE point (point number) <> size REP
    point number DECR 1; 
    UNTIL point number = 1 PER; 
  size := point (point number); 
  IF size = point (1) 
     THEN font pitch table := pitch;
          LEAVE get font 
     ELSE font pitch table := ""
     FI; 
  INT VAR j := point (1); 
  FOR i FROM 1 UPTO length (pitch) REP
    font pitch table CAT code(code (pitch SUB i) * size DIV j)
    PER;

END PROC get font;
 
LET tag            = 1 ,
    bold           = 2 , 
    number         = 3 ,
    string         = 4 ,  (* = text; aber PROC text wird benoetigt *)
    operator       = 5 ,
    delimiter      = 6 , 
    end of file    = 7 , 
    within comment = 8 ,
    within text    = 9 ;
 
PROC load font table (TEXT CONST font file name):
BOOL VAR prop font;
INT VAR type of symbol := 0;
REAL VAR blank in cm ,
         lf in cm;
REAL VAR width, inch factor;
INT VAR factor width;
 
enable stop;
IF NOT exists (font file name)
   THEN errorstop ("Fontdatei nicht vorhanden")
   FI;
font file := sequential file (input, font file name);
  init font;
  font number := 0;
  getline (font file, record);
  protline (record);
  WHILE NOT eof (font file) REP
    font number INCR 1;
    get font name and parameters;
    get char width and output function;
  UNTIL eof (font file) COR font number >= max fonts PER;
  font number := 1; point number := 1;
.
get font name and parameters:
  get font name; 
  get fixed or prop; 
  get blank width; 
  get linefeed height; 
  get pointsizes;
  get optional x steps per inch;
  fill pitch and code table with default;
. 
get font name:
  next entry;  prot (symb);
  IF (symb SUB 1) = "#" 
     THEN symb := subtext (symb, 2);
          WHILE (symb SUB length(symb)) <> "#" REP
            name CAT symb;
            next entry; prot (symb);
            IF symb = ""
               THEN errorstop ("# fehlt beim Fontnamen");
               FI;
            PER;
            name CAT subtext (symb, 1, length (symb)-1)
     ELSE error stop ("1. Symbol kein Fontname")
     FI;
. 
get fixed or prop:
  next entry;
  prop font := (symb SUB 1) = "p" OR (symb SUB 1) = "P";
  prot (symb);
. 
get blank width:
  next entry;
  blank in cm := real (symb); 
  IF NOT last conversion ok COR blank in cm < 0.01 
     THEN errorstop ("Blankbreite falsch") 
     FI;
  prot ("Blank=");prot (symb);
. 
get linefeed height: 
  next entry; 
  lf in cm := real (symb);
  IF NOT last conversion ok COR lf in cm < 0.01 
     THEN errorstop ("Linefeedhoehe falsch") 
     FI;
  prot ("lf="); prot(symb);
.
get pointsizes:
  next entry; 
  IF symb <> "(" 
     THEN protline ("alle Pointgroessen = 1 per Voreinstellung") ; 
          LEAVE get pointsizes
     FI; 
  protline(" "); prot ("lf in punkten=");
  get one lf size;
  lf := int (inch * real (point (1))/ lf in cm + 0.5);
. 
get one lf size:
  FOR i FROM 1 UPTO max nr points REP
    next entry; 
    IF symb = ")" 
       THEN LEAVE get one lf size
       ELIF symb = "" 
            THEN errorstop ("Pointangaben unvollstaendig") 
       FI; 
    point(i) := int (symb); 
    IF NOT last conversion ok COR point (i) < 1
       THEN errorstop ("Pointgroesse falsch")
       FI;
    prot (symb); prot (",");
    PER;
. 
get optional x steps per inch:
  IF symb = ")"
     THEN next entry FI;
  IF symb = "" 
     THEN width := 1.0
     ELSE width := real (symb)
     FI;
  x step := int (inch * width / blank in cm + 0.5);
  factor width := int (width + 0.5);
  IF NOT last conversion ok COR x step < 1
     THEN errorstop ("minimale Schritte falsch")
     FI;
  protline(" "); prot ("Schritte pro Inch="); prot (text(x step)); prot(","); prot (text(lf)); protline(" ");
.
fill pitch and code table with default:
  IF prop font
     THEN pitch  := 255 * code (factor width)
     ELSE pitch  := code (factor width)
     FI;
  kode  := 31 * ""0"";
  kode  CAT 224 * ""1""; (* print all *)
  inch factor := real (x step)
.
get char width and output function:
  WHILE NOT eof (font file) REP
    getline (font file, record);
    protline (record);
    IF (record SUB 1) = "#" AND pos (record, "#", 2, length (record)) > 2
       THEN LEAVE get char width and output function
       FI;
    get internal code for char;
    IF char code > 0 AND char code <= 255
       THEN IF prop font 
               THEN get char width;
                    prot (text(factor width));
                    replace (pitch, char code, code (factor width))
               FI;
               get output function
       FI;
    PER;
.
get internal code for char:
INT VAR char code;
  next entry; prot (symb);
  IF length(symb) = 1 
     THEN char code := code (symb SUB 1)
     ELIF symb >= "000" AND symb <= "255" 
          THEN char code := int (symb); 
               IF NOT last conversion ok 
                  THEN errorstop ("Zeichen falsch") 
                  FI 
     ELSE errorstop ("Zeichen falsch") 
     FI; 

.
get char width:
  next entry; 
  IF pos (symb, ".") > 0
     THEN width := real (symb);
          factor width := int (round(((width * inch factor) / inch), 0))
     ELSE factor width := int (symb) 
     FI;
  IF NOT last conversion ok 
     THEN errorstop ("Breitenangabe falsch") 
     FI 
.
get output function:
  next entry; prot (symb);  protline(" ");
  IF symb = "" 
     THEN symb := "1"
     FI;
  replace (kode, char code, code (int (symb)));
  IF NOT last conversion ok 
     THEN errorstop ("Ausgabefunktion falsch") 
     FI;
END PROC load font table;
 
PROC next entry:
INT VAR next blank pos;
WHILE (record SUB 1) = " " REP
  record := subtext (record, 2, length (record)) PER;
next blank pos := pos (record, " ");
IF next blank pos >= 1
   THEN symb := subtext (record, 1, next blank pos - 1);
        record := subtext (record, next blank pos + 1)
   ELSE symb := record;
        record := ""
   FI;
END PROC next entry;

PROC prot (TEXT CONST t):
  IF online
     THEN put (t)
     FI;
END PROC prot;

PROC protline (TEXT CONST t):
  IF online
     THEN putline (t)
     FI;
END PROC protline;

init font; (* PACKET Initialisierung ******************************)
.
name:   font[font number].name 
. 
pitch:  font[font number].pitch table 
. 
kode:   font [font number].code table 
.
lf:     font [fontnumber].y steps per inch
. 
x step: font [font number].x steps per inch
. 
point:  font [font number].point size
.
END PACKET fonts routines;