/* /__/ /| / / /__/ / / | / / / /_/ / | / / /_/ / / | / / / _/__/ _/ _/ |_/ _/ _/ _/ _/ _/ -> tHiz waZ cOdDeD bY E.N.I.F. <- */ OPT OSVERSION=37 -> jen systém 2.x a vejš, nejsme žádný mejdla MODULE 'intuition/intuition', 'intuition/screens', 'dos/dos' -> pár modulů -> se dicky hodí CONST -> konstanty: WIN_FLAGS = 6144, -> okno backdrop, bez okrajů, ... WIN_IDCMP = IDCMP_MOUSEBUTTONS OR IDCMP_RAWKEY -> čteme myš a klávesy DEF sptr = NIL:PTR TO screen, -> ukazatel na strukturu SCREEN (obrazovku) wptr = NIL:PTR TO window, -> ukazatel na okno exit = 0:LONG, -> pomocná proměná (= 1 když chceme skončit) textbuff = NIL:PTR TO CHAR, -> ukazatel na text, který si načtem do paměti textfile = NIL:LONG, -> ukazatel na otvíraný soubor na disku textlen = 0:LONG, -> délka souboru "textfile" = spotřeba RAM textlines = 0:LONG, -> kolik to má vlastně řádek (informačně) spage = 0:LONG, -> ukazatel na začátek aktuální stránky [znak č.] ... epage = 0:LONG, -> (právě zobrazený) a tohle na její konec [znak číslo] firstline = 0:LONG, -> první řádka stránky [řádka číslo.] lastline = 0:LONG, -> poslední řádka stránky sline = 0:LONG, -> pomocné proměnné eline = 0:LONG, toptext = 1:LONG, -> jsme-li na začátku textu pak = 1, jinak 0 bottomtext = 0:LONG, -> jsme-li na konci textu pak = 1, jinak 0 linebuff[81]:STRING, -> řetězec obsahující právě tištěnou řádku ev:LONG -> sem zachytávám události od systému /*----------------------------------------------------------------------------------------------*/ -> tak tady to začíná... PROC main() DEF myargs:PTR TO LONG, rdargs -> čtení argumentů bude dle os 2.x myargs := [0, 0] -> příprava listu na argumenty IF (rdargs := ReadArgs('SOURCE/A', myargs, NIL)) -> a jejich čtení IF opengui() -> otevření obrazovky a okna IF loadtext(myargs[0]) -> načtení textu do paměti setuptext() -> předzpracování textu fillscreen(textbuff, spage, epage) -> zobrazení první stránky REPEAT -> čtení akcí uživatele ev := WaitIMessage(wptr) -> dáme mu čas :-) = čekání na událost SELECT ev -> už se rozhoupal! CASE IDCMP_RAWKEY -> klávesnice v akci evalkeys(MsgCode()) -> kouknem, co to vlastně zmáčk CASE IDCMP_MOUSEBUTTONS -> tak s myškou jsme si hráli... exit := 1 -> hm, tak teda konec, no. ENDSELECT ev := NIL -> zbytečnej (?) sichr UNTIL exit = 1 -> dokud exit není 1... ENDIF ENDIF ELSE error('No file specified!') -> uživatel nezadal žádný argumenty! ENDIF close_gui() -> všechno po sobě zavřeme flushtext() -> uvolníme paměť s nahraným textem CleanUp(0) -> a zavoláme Viktora Čističe... ENDPROC PROC opengui() DEF er = 0 -> jen berlička init_screen() -> otevření obrazovky (640, 256, 1) IF sptr -> podařilo se? init_window() -> otevření okna (640, 256, BACKGROUND + NOBORDERS) IF wptr -> máme ho? er := 1 -> vše OK ELSE -> jinak... error('Could not open window!') -> zařvem! ENDIF ELSE -> bez obrazovky... error('Could not open screen!') -> koušem! ENDIF ENDPROC er -> vrátíme "er" pro testování v IF -> procedura na otvírání obrazovky kulturním způsobem PROC init_screen() IF sptr:=OpenScreenTagList(NIL, -> systémová funkce [SA_PENS, [-1]:INT, -> workbench barvy SA_DEPTH, 1, -> jenom dvě SA_DISPLAYID, $8000, -> PAL HIRES NIL]) -> konec tagů sptr.detailpen := 1 -> nastavení barev, sptr.blockpen := 0 -> zcela nepodstatné SetColour(sptr,0, 0, 0, 0) -> éčkovská funkce pro nastavení barev SetColour(sptr,1,200,200,200) -> RGB, to pro zjednodušení, jinak vždy ENDIF -> LoadRGB32() a pod.! ENDPROC -> prozměnu nekulturní způsob otevření okna (OpeWindowTags() je lepší!)! PROC init_window() wptr:=OpenW(0, 0, 640, 256, WIN_IDCMP, WIN_FLAGS, NIL, sptr, $F, NIL) IF wptr -> otevřeno dokořán? wptr.detailpen := 1 -> nastavíme barvičky wptr.blockpen := 0 SetTopaz(8) -> a narvem tam topaz (funkce éčka, brr) ENDIF ENDPROC PROC close_gui() -> chcípnem to hrozný gui IF wptr CloseW(wptr) /* uzavření okna */ ENDIF IF sptr CloseS(sptr) /* uzavření obrazovky */ ENDIF ENDPROC PROC infoline() -> zobrazuje horní informační řádku Colour(0, 1) TextF(0, 6, ' UxMore v1.0 - (C) E.N.I.F. lines \d[5], first = \d[5], last = \d[5] ', textlines, firstline, lastline) Colour(1, 0) ENDPROC PROC error(text) -> je-li něco v pr..li, pak poslouží DEF e:LONG -> pomocná proměná IF sptr AND wptr -> máme-li gui nahozený infoline() -> zobrazíme informační řádku (pro pořádek) Colour(1, 0) -> nastavíme barvu pro text (aby bylo na to vidět) TextF(0, 18, '\s', text) -> vypíšeme chybové hlášení e := WaitIMessage(wptr) -> počkáme na přečtení uživatelem (potvrdí myší ELSE -> nebo klávesnicí) WriteF('\s\n', text) -> jsme-li bez gui, vypíšem to do shellu (nebo hellu) ENDIF ENDPROC PROC flushtext() -> vyhazuje text z paměti, viz New() & Dispose() v AE x. díl. IF textbuff <> NIL THEN Dispose(textbuff) ENDPROC PROC loadtext(name = NIL) -> nahraje soubor "name" do paměti DEF er -> pomocná proměná er := 0 -> zatím ještě chyba initvars() -> počáteční nastavení některých glob. proměných textlen := FileLength(name) -> zjištění délky souboru (-1 = soub. neexistuje) IF textlen <> -1 -> existence souboru potvrzena IF textbuff := New(textlen) -> zkusíme si pro něj vyhradit paměť IF textfile := Open(name, OLDFILE) -> máme paměť, otevřem ho IF Read(textfile, textbuff, textlen) -> otevřen, čteme er := 1 -> je v paměti, tak je to OK ELSE error('Could not read file!') -> bléé, nejde to číst! ENDIF ELSE error('Could not open file!') -> fuj, dyk to néde votevřít! ENDIF ELSE error('Could not allocate memory!') -> a kams dals paměť? ENDIF ELSE error('Could not find file!') -> kde je? ENDIF ENDPROC er PROC initvars() -> přenastaví préměné na jejich počáteční hodnoty toptext := 1 -> prochu málo, na samostatnou proceduru :-) bottomtext := 0 /* (jsme, na začátku textu) */ ENDPROC PROC setuptext() -> nalezne konec první strany textu a další DEF i i := 0 -> čítač projitých (nalezených) řádek spage := -1 -> začátek stránky na -1 (viz priline) epage := 0 -> konec stránky na 0 firstline := 1 -> řádkujeme od 1 WHILE (epage <= textlen) AND (i < 27) -> max. 27 řádek na stranu epage := findnextchar(textbuff, epage, textlen, 10) -> najdi znak 10 (LF) i++ ENDWHILE lastline := i - 1 -> poslední řádka je i - 1 IF epage = textlen THEN bottomtext := 1 -> jsme-li na konci textu -> (je-li krátkej) textlines := countlines(textbuff, textlen) -> spočtem, kolik to má řádek ENDPROC -> pro informaci PROC priline(buffer, y, startpoz, len) -> vytiskne řádku na x, y = 0, y DEF i, x, er = 1 x := 0 -> index do řetězce buffer[] i := startpoz + 1 -> počátek čtení znaků v textu Colour(1, 0) -> nastavení barvy tisku WHILE (i < len) AND (buffer[i] <> 10) -> do nejbliššího konce řádku (LF) IF x < 80 -> jen 80 znaků se vejde na obrazovku / do bufferu linebuff[x] := buffer[i] -> kopie znaku z buferu do řetězce x++ ENDIF i++ ENDWHILE linebuff[x] := 0 -> zakončení řetězce nulou TextF(0, y, '\s', linebuff) -> tisk řetězce IF i = epage THEN er := 0 -> jsme-li na konci stránky vracíme nulu ENDPROC er PROC gotoup(buffer:PTR TO CHAR, len) -> skok o řádek výš eline := spage -> uložení začátku zobrazené stránky spage := findprevchar(buffer, spage, 10) -> nalezení předchozího LF epage := findprevchar(buffer, epage, 10) -> -||- pro konec stránky IF (spage < 0) -> jsme na začátku textu toptext := 1 ENDIF IF ((spage = 0) AND (buffer[0] = 10)) -> !*!*! tady je chyba !*!*! spage-- toptext := 1 -> !*!*! tady je chyba - viz konec textu !*!*! firstline-- ENDIF -> !*!*! tady je chyba !*!*! IF epage < len THEN bottomtext := 0 -> nejsme-li zároveň na konci textu firstline-- -> snížení čísel zobrazované první lastline-- -> a poslední řádky ScrollWindowRaster(wptr, 0, -9, 0, 9, 639, 251) -> posun obsahu okna dolů priline (buffer, 16, spage, eline) -> vytištění nové řádky, která se objevila -> nahoře infoline() -> zaktualizování informační řádky ENDPROC PROC gotodown(buffer:PTR TO CHAR, len) -> skok o řádku dolů sline := epage -> uložení konce stránky spage := findnextchar(buffer, spage, len, 10) -> najití dalších LF epage := findnextchar(buffer, epage, len, 10) IF epage = len THEN bottomtext := 1 -> konec textu - zarážka IF spage > 0 THEN toptext := 0 -> nejsme na začátku textu? firstline ++ -> zvýšení čísla první a poslední lastline ++ -> řádky ScrollWindowRaster(wptr, 0, 9, 0, 9, 639, 251) -> skroll okna nahoru priline (buffer, 16 + (9 * 26), sline, epage) -> tisk spodní řádky infoline() -> refresh informační řádky ENDPROC -> vyplní obrazovku textem (používá se jen na začátku programu) PROC fillscreen(buffer:PTR TO CHAR, stpoz, maxpoz) DEF i, y y := 16 infoline() vypsání 26 řádek (nebo méně - je-li text krátký) WHILE (y < 260) AND ((i := priline(buffer, y, stpoz, maxpoz)) <> 0) y := y + 9 stpoz := findnextchar(buffer, stpoz, maxpoz, 10) ENDWHILE ENDPROC PROC countlines(buffer:PTR TO CHAR, len) -> spočte počet řádek v textu DEF i, c, count = 0 FOR i := 0 TO len - 1 c := buffer[i] IF c = 10 THEN count++ ENDFOR ENDPROC count -> nalezne další znak "ch" PROC findnextchar(buffer:PTR TO CHAR, startpoz, len, ch) DEF i IF startpoz < len -> nejsme-li na konci i := startpoz + 1 -> posun o jeden znak WHILE (buffer[i] <> ch) AND (i < len) -> dokud znak nenaleznem i++ ENDWHILE ENDIF ENDPROC i -> vrať, kd jsme ho našli -> to samé jako předchozí, ale pozpátku PROC findprevchar(buffer:PTR TO CHAR, startpoz, ch) DEF i IF startpoz > 0 i := startpoz - 1 WHILE (buffer[i] <> ch) AND (i > -1) i-- ENDWHILE ENDIF ENDPROC i PROC evalkeys(code) -> vyhodnocení stisklých kláves DEF i SELECT code CASE 69 -> ESC exit := 1 -> šipky CASE 76 -> UP IF toptext = 0 -> nejsme-li na začátku textu gotoup(textbuff, textlen) ENDIF CASE 77 -> DOWN IF bottomtext = 0 -> nejsme-li na konci textu gotodown(textbuff, textlen) ENDIF CASE 79 -> LEFT i := 1 -> 27 krát posun o řádku nahoru WHILE (toptext = 0) AND (i < 27) gotoup(textbuff, textlen) i++ ENDWHILE CASE 78 -> RIGHT i := 1 -> 27 krát posun o řádku dolů WHILE (bottomtext = 0) AND (i < 27) gotodown(textbuff, textlen) i++ ENDWHILE DEFAULT NOP -> pro zvýšení efektivity - NOP ;-) ENDSELECT ENDPROC /*------------------------------------- END ----------------------------------------------------*/ vers: CHAR '$VER: UxMore 1.0 (09.09.1998) c E.N.I.F.',0 -> version STRING
Dvešní díl AE - Prakticky je u konce (já taky :-)). Loučím se: Má poklona,
pardálové! a někdy příště čauky!
E.N.I.F.
PS. Komerční využití zdrojáku povoluji, ale za 200% podíl na zisku. Ha, ha!AMIGA E - V.díl |
Vokecávky | Hardware | Warez | WBoviny | Dema | Gfx&Muz | Pařby | Vokecávky 2 |