' *****************************************************************************
' *                                                                           *
' * Diese Programm wandelt ein 1st_WORD_Dokument in ein Signum2_Dokument um.  *
' * Dabei werden  einige  Textattribute ( insbesondere  Exponent und  Index,  *
' * aber auch  Fett,  Kursiv,  Unterstreichen,  Absatz ) richtig  umgesetzt.  *
' *                                                                           *
' *      @ by Georg Scheibler, Fillekuhle 7, 4920 Leogo, 08. 01. 1988         *
' *                                                                           *
' *****************************************************************************
'
DIM zeichen%(256),zeichensatz%(256),breite%(256),seite$(100)
DIM zeichensatz.name$(4)
PRINT AT(20,24);"Diese Programm ist @ by G.A.S. 11. 01. 1988;"
PRINT AT(4,2);"Dieses Programm wandelt ein 1st-WORD Dokument in ein Signum2-Dokument um"
@zeichen.einlesen
path$="\"
'
neue.datei:
PRINT AT(22,3);"Bitte 1st-WORD-Dokument ausw„hlen"
REPEAT
  FILESELECT path$+"*.DOC","",name$
  IF name$=""
    ALERT 2,"Wollen sie das Programm|beenden??",2,"ja|nein",dummy%
    IF dummy%=1
      END
    ENDIF
  ENDIF
  namneu$=name$
  WHILE INSTR(namneu$,"\")>0
    namneu$=MID$(namneu$,INSTR(namneu$,"\")+1)
  WEND
  path$=LEFT$(name$,LEN(name$)-LEN(namneu$))
UNTIL EXIST(name$)
PRINT AT(22,3);SPC(40)
seiten.zahl%=1
zeilenabstand%=11
indexabstand%=3
seitenparameter$=""
n.zeilenabstand%=zeilenabstand%
CLR atribute%,e.space%,gesamt.laenge%,gesamt.zeilen%,i.space%,index%
CLR seitenlaenge%,space%,zeilenzaehler%
absatz!=FALSE
fussnote!=FALSE
fuss.seite!=FALSE
seite$(1)=MKL$(2)+MKI$(&HC000)
absatz%=&H400
zeilen.pro.seite%=60  ! Voreinstellung fr ASCII-Dateien
PRINT AT(35,9);"Seite : 1";AT(35,10);"Zeile :"
OPEN "i",#1,name$
DO
  LINE INPUT #1,z$
  z$=z$+CHR$(13)
  lo1%=LEN(z$)+1
  pointer%=1
  WHILE lo1%>pointer%
    b%=ASC(MID$(z$,pointer%,1))
    INC pointer%
    IF b%=&H1F
      @systemeintrag
    ELSE
      IF b%>&H1B OR b%=&H19
        @normales.zeichen
      ELSE
        @format
      ENDIF
    ENDIF
  WEND
  EXIT IF EOF(#1)
LOOP
@seitenparameter
PRINT AT(43,9);seiten.zahl%
CLOSE #1
PRINT AT(20,3);"Bitte Namen fr neues Dokument eingeben"
IF INSTR(namneu$,".")>0
  namneu$=LEFT$(namneu$,INSTR(namneu$,".")-1)
ENDIF
namneu$=namneu$+".SDO"
FILESELECT path$+"*.SDO",namneu$,namneu$
IF namneu$<>""
  OPEN "o",#2,namneu$
  @signum.kopf
  @signum.text
  @signum.ende
  CLOSE #2
ENDIF
ALERT 2,"Wollen Sie eine weitere Datei|umwandeln?",1,"Ja|Ende",dummy%
IF dummy%=1
  GOTO neue.datei
ENDIF
'
PROCEDURE zeichen.einlesen
  ' Einlesen der Parameter fr die Zeichen
  PRINT AT(22,10);"Ich lade die Datei `CONVERT.PAR'"
  OPEN "i",#3,"CONVERT.PAR"
  REPEAT
    LINE INPUT #3,a$
    i%=VAL(a$)
    IF i%>0 AND i%<5
      zeichensatz.name$(i%)=MID$(a$,3,INSTR(a$+" "," ")-2)
    ENDIF
  UNTIL LEFT$(a$)="0"
  REPEAT
    LINE INPUT #3,a$
    i%=VAL(a$)
    PRINT AT(55,10);i%
    IF i%>0 AND i%<256
      p%=1
      @naechste.zahl
      zeichensatz%(i%)=VAL(MID$(a$,p%))-1
      @naechste.zahl
      breite%(i%)=VAL(MID$(a$,p%))
      @naechste.zahl
      zeichen%(i%)=VAL(MID$(a$,p%))
    ENDIF
  UNTIL LEFT$(a$)="0"
  CLOSE #3
  PRINT AT(20,10);SPC(40)
RETURN
PROCEDURE naechste.zahl
  p%=INSTR(a$,",",p%)+1
  WHILE MID$(a$,p%,1)=" "
    INC p%
  WEND
RETURN
'
PROCEDURE signum.kopf
  PRINT #2,"sdoc0001";MKL$(&H80);STRING$(&H48,0);
  PRINT #2,MKL$(XBIOS(23));MKL$(XBIOS(23));STRING$(&H30,0);
  PRINT #2,"cset";MKL$(&H50);
  FOR i%=1 TO 4
    PRINT #2,zeichensatz.name$(i%);STRING$(10-LEN(zeichensatz.name$(i%)),0);
  NEXT i%
  PRINT #2,STRING$(&HE4-LOC(#2),0);
  PRINT #2,"sysp";MKL$(&H6E);STRING$(&H50,0);
  ' Standartseitenformat
  PRINT #2,MKI$(6);                     !Leerzeichenbreite
  PRINT #2,MKI$(0);                     !Sperrung
  PRINT #2,MKI$(zeilenabstand%);        !Hauptzeilenabstand
  PRINT #2,MKI$(indexabstand%);         !Indexabstand
  PRINT #2,MKI$(0);                     !Linker Rand
  PRINT #2,MKI$(6.5*90);                !Rechter Rand
  PRINT #2,MKI$(0.1*54);                !Kopfzeilen
  PRINT #2,MKI$(0.1*54);                !Fužzeilen
  PRINT #2,MKI$(10.4*54);               !Seitenl„nge
  PRINT #2,MKI$(&H5800)                 !Keine Seitennumerierung
  PRINT #2,MKI$(x10011);                !Format. Optionen
  PRINT #2,MKI$(&H302);                 !trennen
  PRINT #2,MKI$(0);                     !Randausgleiche und Sperren
  PRINT #2,MKI$(1);             !nicht einrcken, Absatzabstand korrigieren
  '
  PRINT #2,"pbuf";MKL$(&H20+&H22*seiten.zahl%);
  PRINT #2,MKL$(seiten.zahl%);MKL$(&H20);MKL$(1);
  PRINT #2,"undeundeundeundeunde";
  PRINT #2,LEFT$(seitenparameter$,seiten.zahl%*&H22);
RETURN
'
PROCEDURE signum.text
  PRINT #2,"tebu";MKL$(gesamt.laenge%+8);MKL$(gesamt.zeilen%+460);
  FOR i%=1 TO seiten.zahl%
    PRINT #2,seite$(i%);
  NEXT i%
  PRINT #2,MKL$(&HF90000);
RETURN
'
PROCEDURE signum.ende
  PRINT #2,"hcim";MKL$(&H10);STRING$(&H10,0);
  PRINT #2,"p101";MKL$(0);
  PRINT #2,"syp2";MKL$(&H40);MKI$(zeilenabstand%);MKL$(5);STRING$(&H3A,0);
RETURN
'
PROCEDURE seitenparameter
  seite$(seiten.zahl%)=seite$(seiten.zahl%)+MKI$(n.zeilenabstand%)
  IF seiten.zahl%>1
    seite$(seiten.zahl%)=seite$(seiten.zahl%)+MKI$(4)+MKI$(&HA080)+MKI$(seiten.zahl%-1)
  ELSE
    seite$(seiten.zahl%)=seite$(seiten.zahl%)+MKL$(&H2A000)
  ENDIF
  ADD gesamt.laenge%,LEN(seite$(seiten.zahl%))
  ADD seiten.laenge%,n.zeilenabstand%
  ADD gesamt.zeilen%,n.zeilenabstand%
  s$=MKI$(seiten.zahl%-1)+MKI$(seiten.zahl%)+MKI$(seiten.zahl%)
  s$=s$+MKI$(seiten.laenge%)+MKI$(0)+MKI$(6.5*90)+MKI$(1)+MKI$(1)
  s$=s$+MKI$(&H5800)+STRING$(30,0)
  seitenparameter$=seitenparameter$+LEFT$(s$,&H22)
  PRINT AT(43,9);seiten.zahl%+1'
  CLR seiten.laenge%,zeilenzaehler%
  seite$(seiten.zahl%+1)=MKI$(&HF)+MKI$(4)+MKI$(&HC080)+MKI$(seiten.zahl%)
  ADD gesamt.zeilen%,16
RETURN
'
PROCEDURE systemeintrag
  ' Systemeintr„ge werden berlesen
  b%=ASC(MID$(z$,pointer%,1))
  INC pointer%
  IF b%=&H4E              !Fužnotentexte
    z$=STR$(VAL(MID$(z$,pointer%,3)))
    lo1%=LEN(z$)+1
    pointer%=1
    IF fuss.seite!=FALSE
      @seitenparameter
      INC seiten.zahl%
      PRINT "Fužseite"
      fuss.seite!=TRUE
    ENDIF
    atribute%=&H4000000
  ELSE
    IF b%=&H30
      zeilen.pro.seite%=VAL(MID$(z$,pointer%,2))
      ADD pointer%,2
      FOR i%=1 TO 4
        SUB zeilen.pro.seite%,VAL(MID$(z$,pointer%,2))
        ADD pointer%,2
      NEXT i%
    ENDIF
  ENDIF
  IF b%<>&H4E
    pointer%=lo1%+1
  ENDIF
RETURN
'
PROCEDURE normales.zeichen
  IF b%=&H1E OR b%=&H19 OR b%=&H2D
    absatz!=FALSE
  ELSE
    absatz!=TRUE
  ENDIF
  IF b%>&H20 OR b%=&H19
    IF index%>0
      IF index%=1
        e.zeile$=e.zeile$+MKL$((zeichen%(b%)+zeichensatz%(b%)*128)*&H10000+e.space%+atribute%)
        CLR e.space%
      ELSE
        i.zeile$=i.zeile$+MKL$((zeichen%(b%)+zeichensatz%(b%)*128)*&H10000+i.space%+atribute%)
        CLR i.space%
      ENDIF
    ELSE
      IF space%>63 OR atribute%>0
        zeile$=zeile$+MKL$((zeichen%(b%)+zeichensatz%(b%)*128)*&H10000+space%+atribute%)
      ELSE
        zeile$=zeile$+MKI$(&H8000+zeichen%(b%)+zeichensatz%(b%)*128+space%*512)
      ENDIF
      CLR space%
    ENDIF
    ADD space%,breite%(b%)
    ADD i.space%,breite%(b%)
    ADD e.space%,breite%(b%)
  ELSE
    IF b%>&H1C                                  !Dehnungsleerzeichen ignorieren
      ADD space%,6
      ADD i.space%,6
      ADD e.space%,6
      IF b%=&H1D                                !Erstes Leerzeichen beim Einrcken
        WHILE ASC(MID$(z$,pointer%,1))=&H1C     !Dehnungsleerzeichen beachten
          INC pointer%
          ADD space%,6
          ADD i.space%,6
          ADD e.space%,6
        WEND
      ENDIF
    ENDIF
  ENDIF
RETURN
'
PROCEDURE format
  IF b%=&H1B
    b%=ASC(MID$(z$,pointer%,1))
    INC pointer%
    IF b%>127
      CLR atribute%,index%
      IF b% AND &X1                             !fett
        atribute%=atribute% OR &X100000000000000
      ENDIF
      IF b% AND &X10                            !hell, ignorieren
      ENDIF
      IF b% AND &X100                           !kursiv
        atribute%=atribute% OR &X10000000000000
      ENDIF
      IF b% AND &X1000                          !unterstrichen
        atribute%=atribute% OR &H40000000
      ENDIF
      IF b% AND &X10000    !superscript (Kleinschreiben, unterstreichen l”schen)
        atribute%=atribute% OR &X100000000000 AND &HBFFFFFFF
        index%=1
      ENDIF
      IF b% AND &X100000   !subscript   (Kleinschreiben, unterstreichen l”schen)
        atribute%=atribute% OR &X100000000000 AND &HBFFFFFFF
        index%=2
      ENDIF
    ENDIF
  ELSE
    IF b%=&HD
      IF LEN(e.zeile$)>0
        SUB n.zeilenabstand%,indexabstand%
        e.zeile$=MKI$(n.zeilenabstand%-1)+MKI$(LEN(e.zeile$)+2)+MKI$(0)+e.zeile$
        seite$(seiten.zahl%)=seite$(seiten.zahl%)+e.zeile$
        ADD seiten.laenge%,n.zeilenabstand%
        ADD gesamt.zeilen%,n.zeilenabstand%
        n.zeilenabstand%=indexabstand%
      ENDIF
      zeile$=MKI$(n.zeilenabstand%-1)+MKI$(LEN(zeile$)+2)+MKI$(absatz%)+zeile$
      seite$(seiten.zahl%)=seite$(seiten.zahl%)+zeile$
      ADD seiten.laenge%,n.zeilenabstand%
      ADD gesamt.zeilen%,n.zeilenabstand%
      n.zeilenabstand%=zeilenabstand%
      IF LEN(i.zeile$)>0
        SUB n.zeilenabstand%,indexabstand%
        i.zeile$=MKI$(indexabstand%-1)+MKI$(LEN(i.zeile$)+2)+MKI$(0)+i.zeile$
        seite$(seiten.zahl%)=seite$(seiten.zahl%)+i.zeile$
        ADD seiten.laenge%,indexabstand%
        ADD gesamt.zeilen%,indexabstand%
      ENDIF
      CLR space%,zeile$,e.space%,e.zeile$,i.zeile$,i.space%
      INC zeilenzaehler%
      PRINT AT(43,10);zeilenzaehler%'
      IF zeilenzaehler%=zeilen.pro.seite%
        @seitenparameter
        INC seiten.zahl%
      ENDIF
      IF absatz!
        absatz%=&HC00
      ELSE
        absatz%=&H400
      ENDIF
    ELSE
      IF b%<>10                       !Linefeed ignorieren
        IF b%=11
          b%=256-ASC(MID$(z$,pointer%,1))
          INC pointer%                !abh„ngige Seitenende
          IF zeilenzaehler%+b%>=zeilen.pro.seite% AND b%<zeilen.pro.seite%
            @seitenparameter
            INC seiten.zahl%
          ENDIF
        ELSE
          IF b%=12                    !hartes Seitenende
            @seitenparameter
            INC seiten.zahl%
          ELSE
            IF b%=&H18
              IF fussnote!
                fussnote!=FALSE
              ELSE
                ADD pointer%,3        !Fužnotenzusatzinformation
                atribute%=atribute% OR &H4000000        !Fužnotenflag
                fussnote!=TRUE
              ENDIF
            ELSE
              ALERT 3,"Unbekannte Steuerzeichen||   "+STR$(b%)+"| ",1,"weiter",dummy%
            ENDIF
          ENDIF
        ENDIF
      ENDIF
    ENDIF
  ENDIF
RETURN
