home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Misc / VIDEOTEXT.LZX / VTsrc / VTview.p < prev   
Encoding:
Text File  |  1996-04-19  |  9.5 KB  |  297 lines

  1. PROGRAM VTview;
  2. FROM vt USES pagelist,decode,sys2; {$opt q,s+,i+ }
  3. { Stellt roh abgespeicherte Videotextseiten auf einem eigenen Screen dar. }
  4. CONST version = '$VER: VTview 2.5  (18.04.96)';
  5.  
  6. {$incl "dos.lib", "workbench/startup.h", "icon.lib" }
  7.  
  8. VAR j, timing, countdown, anzseiten: Integer;
  9.     auto, cycle, conceal, stop: Boolean;
  10.     incomplete,concealed: Boolean; { Rückmeldungen von writepage() }
  11.     titel,inputname: Str80; STATIC;
  12.     l: Long;
  13.  
  14. { Ein paar Routinen aus dem VT-Hauptprogramm deklarieren und includen: }
  15. CONST pgoffx=1;
  16. PROCEDURE writepage(seite: p_onepage, verdeckt: Boolean); FORWARD;
  17. FUNCTION number_from_page(x,y: Integer): Integer; FORWARD;
  18. FUNCTION filetype(name: Str80): Integer; FORWARD;
  19. FUNCTION getpages(filename: Str80; sorted: Boolean): Integer; FORWARD;
  20. CONST unit_bildschirm=1; unit_datei=1;
  21. {$path "PAS:prg/vt/"; incl "dbluse.p" }
  22.  
  23. { ###################################################################### }
  24. { -------------------------- Initialisierungen ------------------------- }
  25. { ###################################################################### }
  26.  
  27. PROCEDURE get_args;
  28. { Wertet CLI- oder WorkBench-Argumente aus: Die spezifizierten Dateien }
  29. { werden mit getpages() eingelesen. }
  30. { ToolTypes:                  CLI-Parameter:  }
  31. { MODE=MAN|AUTO|CYCLE         -a -c }
  32. { FLAGS=REVEAL|CONCEAL        -r }
  33. { TIMING=<secs>               -t<secs> }
  34. VAR c: char;
  35.     s: ^String[1000];
  36.     len,i,j,ok: integer;
  37.     hail: p_WBStartup;
  38.     arg: p_WBArg;
  39.     olddir: BPTR;
  40.     icon: p_DiskObject;
  41.     entry: Str;
  42.     name: Str80;
  43. FUNCTION is_space(ch: Char): Boolean;
  44. BEGIN  is_space := (ch=' ') OR (ch=#9) OR (ch=#10) OR (ch=#13);  END;
  45. BEGIN
  46.   conceal := True;
  47.   auto := False;
  48.   cycle := False;
  49.   timing := 2;
  50.   anzseiten := 0;
  51.   IF fromWB then BEGIN
  52.     OpenLib(IconBase,'icon.library',0);
  53.     hail := StartupMessage;
  54.     arg := hail^.sm_ArgList;
  55.     FOR i := 1 TO hail^.sm_NumArgs do BEGIN
  56.       olddir := CurrentDir(arg^.wa_Lock);
  57.       name := arg^.wa_Name;
  58.       IF filetype(name)=1 THEN    { nur VTPG-Dateien lesen }
  59.         anzseiten := anzseiten + getpages(name,False);
  60.       icon := GetDiskObject(arg^.wa_Name);
  61.       IF icon<>Nil THEN BEGIN
  62.         entry := FindToolType(icon^.do_ToolTypes, 'MODE');
  63.         IF ptr(entry)<>Nil THEN BEGIN
  64.           IF MatchToolValue(entry,'MAN') THEN auto := False;
  65.           IF MatchToolValue(entry,'AUTO') THEN BEGIN
  66.             auto := True; cycle := False; END;
  67.           IF MatchToolValue(entry,'CYCLE') THEN BEGIN
  68.             auto := True; cycle := True; END;
  69.         END;
  70.         entry := FindToolType(icon^.do_ToolTypes, 'FLAGS');
  71.         IF ptr(entry)<>Nil THEN BEGIN
  72.           IF MatchToolValue(entry,'REVEAL') THEN conceal := False;
  73.           IF MatchToolValue(entry,'CONCEAL') THEN conceal := True;
  74.         END;
  75.         entry := FindToolType(icon^.do_ToolTypes, 'TIMING');
  76.         IF Ptr(entry)<>Nil THEN
  77.           Val(entry,timing,ok);
  78.         FreeDiskObject(icon);
  79.       END;
  80.       IF i>1 THEN
  81.         olddir := CurrentDir(olddir);
  82.       { auf nächsten WBArg-Zeiger zugreifen: }
  83.       arg := Ptr(Long(arg)+SizeOf(WBArg));
  84.     END;
  85.     CloseLib(IconBase);
  86.   END ELSE IF ParameterLen>0 THEN BEGIN
  87.     s := ParameterStr; len := ParameterLen;
  88.     { Parameterzeile in Worte zerlegen, wie der argv[] in C es schon ist :-( }
  89.     i := 1; while i<=len do BEGIN
  90.       WHILE is_space(s^[i]) DO Inc(i);
  91.       j := i + 1;
  92.       IF s^[i]='"' THEN BEGIN
  93.         Inc(i); while (s^[j]<>'"') AND (j<=len) do Inc(j);
  94.       END ELSE BEGIN
  95.         WHILE NOT is_space(s^[j]) AND (j<=len) do Inc(j);
  96.       END;
  97.       { Zeiger i: 1. Zeichen des Wortes, j: 1. Trennzeichen dahinter }
  98.       IF s^[i]='-' THEN BEGIN
  99.         i := i+2;
  100.         CASE s^[i-1] OF
  101.           't': Val(copy(s^,i,j-i),timing,ok);
  102.           'r': conceal := False;
  103.           'a': auto := True;
  104.           'c': BEGIN auto := True; cycle := True; END;
  105.           otherwise BEGIN
  106.             writeln('usage:');
  107.             writeln('VTview <file> <file> ... -r[eveal] -a[uto] -c[ycle] -t<secs> ');
  108.             writeln('with <file> containing raw VideoText pages ("VTPG" format)');
  109.           END;
  110.         END;
  111.       END ELSE
  112.         IF filetype(Copy(s^,i,j-i))=1 THEN
  113.           anzseiten := anzseiten + getpages(Copy(s^,i,j-i),False)
  114.         ELSE
  115.           Writeln('Keine VTPG-Datei: ',Copy(s^,i,j-i));
  116.       i := j + 1;
  117.     END;
  118.   END;
  119. END;
  120.  
  121. { ###################################################################### }
  122. { ------------------ Hauptprogramm/Ereignisverwaltung ------------------ }
  123. { ###################################################################### }
  124.  
  125. CONST stacksize=10;
  126.  
  127. VAR pgstack: ARRAY[1..stacksize] OF RECORD pg,sp: Integer; END;
  128.     stackptr,stackbot: Integer;
  129.  
  130. PROCEDURE push(seite: p_onepage);
  131. { "vergeßlicher" Stack: Überlauf führt nicht zum Abweisen der neuen }
  132. { Seitennummer, sondern zum Vergessen der ältesten. }
  133. BEGIN
  134.   IF seite<>Nil THEN BEGIN
  135.     pgstack[stackptr].pg := seite^.pg;
  136.     pgstack[stackptr].sp := seite^.sp;
  137.     Inc(stackptr); IF stackptr>stacksize THEN stackptr := 1;
  138.     IF stackptr=stackbot THEN BEGIN
  139.       Inc(stackbot); IF stackbot>stacksize THEN stackbot := 1;
  140.     END;
  141.   END;
  142. END;
  143.  
  144. FUNCTION pop: p_onepage;
  145. VAR seite: p_onepage;
  146.     nr: Integer;
  147. BEGIN
  148.   seite := Nil;
  149.   WHILE (stackptr<>stackbot) AND (seite=Nil) DO BEGIN
  150.     Dec(stackptr); IF stackptr=0 THEN stackptr := stacksize;
  151.     seite := hunt_in_list(pgstack[stackptr].pg,pgstack[stackptr].sp,True);
  152.   END;
  153.   pop := seite;
  154. END;
  155.  
  156. PROCEDURE handle_menu(code: Long);
  157. VAR item,subitem: Word;
  158. BEGIN
  159.   menupicked := False;
  160.   item := code SHR 8;
  161.   subitem := code AND $FF;
  162.   CASE item OF
  163.     { *** VTview *** }
  164.     $0101: stop := True; { Ende }
  165.     OTHERWISE;
  166.   END;
  167. END;
  168.  
  169. PROCEDURE handle_escseq(s: str80);
  170. { wie handle_key, aber für die ESC-Sequenzen der Sondertasten }
  171. VAR nr: Integer;
  172. BEGIN
  173.   { Cursor: Seitenliste durchblättern }
  174.   IF s=' A' THEN s := 'R'; { doofe Codes, ändern! }
  175.   IF s=' @' THEN s := 'Q';
  176.   IF (s[1] IN ['A'..'D','Q'..'T']) AND (thispage<>Nil) THEN BEGIN
  177.     nr := thispage^.pg;
  178.     CASE s[1] OF
  179.       'A': IF (thispage^.prev<>Nil) THEN
  180.         thispage := thispage^.prev;
  181.       'B': IF (thispage^.next<>Nil) THEN
  182.         thispage := thispage^.next;
  183.       'C': thispage := next_magazine(thispage);
  184.       'D': thispage := prev_magazine(thispage);
  185.       'Q': WHILE (thispage^.next<>Nil) DO
  186.         thispage := thispage^.next;
  187.       'R': thispage := root;
  188.       'S': WHILE (thispage^.next<>Nil) AND (thispage^.pg=nr) DO
  189.         thispage := thispage^.next;
  190.       'T': WHILE (thispage^.prev<>Nil) AND (thispage^.pg=nr) DO
  191.         thispage := thispage^.prev;
  192.       OTHERWISE;
  193.     END;
  194.     update_slider(posn_in_list(thispage),anzseiten);
  195.     writepage(thispage,conceal);
  196.   END;
  197. END;
  198.  
  199. PROCEDURE handle_key(key: char);
  200. VAR pg: p_onepage;
  201. BEGIN
  202.   CASE key OF
  203.     #27: BEGIN pg := pop; IF pg<>Nil THEN BEGIN
  204.           thispage := pg; update_slider(posn_in_list(pg),anzseiten);
  205.           writepage(thispage,conceal);
  206.         END;
  207.       END;
  208.     ' ': writepage(thispage,True);
  209.     '?': writepage(thispage,false);
  210.     #155: handle_escseq(escseq);
  211.     OTHERWISE;
  212.   END;
  213. END;
  214.  
  215. PROCEDURE handle_click;
  216. VAR pg: p_onepage;
  217.     nr: Integer;
  218. BEGIN
  219.   mouseclicked := False;
  220.   nr := number_from_page(clickedx,clickedy);
  221.   IF nr>=0 THEN BEGIN   { Nummer in einer Seite angeklickt }
  222.     pg := hunt_in_list(nr,0,True);
  223.     IF pg=Nil THEN pg := hunt_in_list(nr,1,True);
  224.     IF pg=Nil THEN pg := hunt_in_list(nr,0,False);
  225.     IF pg<>Nil THEN IF pg^.pg<>nr THEN pg := Nil;
  226.     IF (pg<>Nil) AND (pg<>thispage) THEN BEGIN  { Seite anspringen }
  227.       push(thispage);
  228.       thispage := pg; update_slider(posn_in_list(pg),anzseiten);
  229.       writepage(thispage,conceal);
  230.     END;
  231.   END ELSE CASE clickedy OF
  232.       1..8: handle_escseq('A'); { oberes Seitendrittel }
  233.       9..16: handle_key(#27); { Seitenmitte }
  234.       17..24: handle_escseq('B'); { unteres Seitendrittel }
  235.       OTHERWISE;
  236.     END;
  237. END;
  238.  
  239. PROCEDURE handle_slider;
  240. VAR pg: p_onepage;
  241.     nr: Integer;
  242. BEGIN
  243.   slidermoved := False;
  244.   nr := Round(sliderposn*(anzseiten-1));
  245.   pg := page_on_posn(nr);
  246.   IF (pg<>Nil) AND (pg<>thispage) THEN BEGIN  { Seite anspringen }
  247.     thispage := pg; writepage(thispage,conceal);
  248.     update_slider(posn_in_list(pg),anzseiten);
  249.   END;
  250. END;
  251.  
  252. BEGIN   { Hauptprogramm }
  253.   get_args;   { Parameter holen, Seiten einlesen }
  254.   IF anzseiten=0 THEN BEGIN
  255.     IF NOT fileselect('VT-Seiten laden',False,inputname) THEN Exit;
  256.     IF filetype(inputname)=1 THEN    { nur VTPG-Dateien lesen! }
  257.       anzseiten := getpages(inputname,False);
  258.   END;
  259.   colperm := $03746521; colperms := hexstr(colperm,8);
  260.             { 01234567  07613542 }
  261.   AddExitServer(sysclean); sysinit(version);
  262.   update_slider(0,anzseiten);
  263.   Write(#155'0 p'); { Cursor aus }
  264.   countdown := timing;
  265.   stackbot := 1; stackptr := stackbot;
  266.   writepage(thispage,conceal);
  267.   REPEAT
  268.     IF NOT newevent THEN event_scan;
  269.     IF newevent THEN BEGIN
  270.       auto := False; newevent := False;
  271.       IF mouseclicked THEN handle_click;
  272.       IF menupicked THEN handle_menu(menucode);
  273.       IF slidermoved THEN handle_slider;
  274.       IF taste<>#0 THEN handle_key(taste);
  275.     END ELSE IF auto THEN BEGIN
  276.       Delay(50); Dec(countdown);
  277.       IF countdown<=0 THEN
  278.         IF thispage<>Nil THEN BEGIN
  279.           IF thispage^.next=Nil THEN
  280.             IF cycle THEN thispage := root ELSE stop := True
  281.           ELSE
  282.             thispage := thispage^.next;
  283.           IF NOT stop THEN BEGIN
  284.             update_slider(posn_in_list(thispage),anzseiten);
  285.             writepage(thispage,conceal);
  286.             countdown := timing;
  287.           END;
  288.         END ELSE
  289.           stop := True;
  290.     END ELSE
  291.       l := Wait(-1);
  292.   UNTIL stop;
  293.   SetStdIO(Nil); CloseConsole(Con);
  294.   kill_list; sysclean;
  295. END.
  296.  
  297.