home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / fm2000 / showtext.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-02-04  |  25.4 KB  |  1,079 lines

  1. /*
  2.      Filemaster - Multitasking directory utility.
  3.      Copyright (C) 2000  Toni Wilen
  4.      
  5.      This program is free software; you can redistribute it and/or
  6.      modify it under the terms of the GNU General Public License
  7.      as published by the Free Software Foundation; either version 2
  8.      of the License, or (at your option) any later version.
  9.      
  10.      This program is distributed in the hope that it will be useful,
  11.      but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.      GNU General Public License for more details.
  14.      
  15.      You should have received a copy of the GNU General Public License
  16.      along with this program; if not, write to the Free Software
  17.      Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. */
  19.  
  20. #include <exec/types.h>
  21. #include <exec/memory.h>
  22. #include <graphics/gfxbase.h>
  23. #include <dos/dos.h>
  24. #include <proto/all.h>
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include "fmnode.h"
  28. #include "child.h"
  29. #include "fmdos.h"
  30. #include "fmlocale.h"
  31. #include "fmgui.h"
  32.  
  33. struct ShowTxt {
  34.     unsigned showinfo:2;
  35. };
  36. extern struct FMConfig *fmconfig;
  37. extern struct TextFont *txtshowfont;
  38. extern struct GfxBase *GfxBase;
  39. extern struct FMMain fmmain;
  40.  
  41. WORD __asm hexconvert(register __a0 UBYTE*,register __a1 UBYTE*,register __d0 WORD,register __d1 WORD);
  42.  
  43. void showascfile(void);
  44. void showhexfile(void);
  45. WORD showtext(struct FMHandle*,struct CMenuConfig*);
  46. void getjump(struct STL*);
  47. void textsearch(struct STL*,WORD);
  48. void setreqstate(struct STL*);
  49. void resetreqstate(struct STL*);
  50. void convertstring(struct STL*,UBYTE*,UBYTE**,WORD);
  51. void escmode(struct STL*,UBYTE**,UBYTE**,WORD*);
  52. void strtext(struct STL*,struct RastPort*,UBYTE*);
  53. void escstyle(UBYTE**,UBYTE*,UBYTE,UBYTE*,UBYTE,UBYTE*,UBYTE);
  54.  
  55. void __saveds showtextfile(void)
  56. {
  57. struct ProcMsg *pm;
  58. struct FMList *slist;
  59. struct FMNode *node;
  60. struct FMHandle *h;
  61. WORD ret;
  62.  
  63. pm=sinitproc();
  64. slist=fmmain.sourcedir;
  65. if (!(setalloc(slist,1))) {
  66.     initproc(0,0); 
  67.     goto endi;
  68. }
  69. initproc(slist,pm->cmc->label);
  70. priority(pm->cmc);
  71. if(sselected(slist,1)) {
  72.     while((node=findselnode(slist))) {
  73.         if (h=openfile(slist,NDFILE(node),OFNORMAL|OFDECRUNCH)) {
  74.             ret=showtext(h,pm->cmc);
  75.             closefile(h);
  76.         }
  77.         node->flags&=~NSELECTED;
  78.         outputlistline(slist,node);
  79.         if (!ret) break;
  80.     }
  81. }
  82. endproc(slist);
  83. endi:
  84. deinitproc(pm);
  85. }
  86.  
  87. struct STN {
  88.     struct STN *succ;
  89.     struct STN *pred;
  90.     LONG databytes;
  91.     UBYTE buffer;
  92. };
  93. struct STL {
  94.     struct STN *head;
  95.     struct STN *tail;
  96.     struct STN *tailpred;
  97.     struct FMHandle *handle;
  98.     LONG lines;        //loaded lines
  99.     LONG bytes;        //loaded bytes
  100.     LONG remain;        //remaining bytes
  101.     LONG topline;
  102.     WORD numlines;        //screen lines
  103.     WORD numrows;        //screen rows
  104.     struct Screen *screen;
  105.     struct Window *window;
  106.     struct BitMap *bitmap;
  107.     struct BitMap *vbitmap;
  108.     struct BitMap *cbitmap;
  109.     WORD flag;
  110.     WORD scroll;
  111.     LONG pointer1;        //downscroll pointer
  112.     struct STN *usenode1;
  113.     LONG pointer2;        //upscroll pointer
  114.     struct STN *usenode2;
  115.     UBYTE *buffer;
  116.     UBYTE *ascbuffer;
  117.     WORD height;        //total height
  118.     WORD rows;        //number of characters per line
  119.     WORD hexrows;        //=rows/3-1;
  120.     WORD scrollvalue;
  121.     WORD xx;        //start x
  122.     BYTE loaded;
  123.     BYTE newsearch;
  124.     struct ShowTxt *config;
  125.     UBYTE style;
  126.     UBYTE color1,color2;
  127.     UBYTE searchstring[32];
  128.     UBYTE firstinfo;
  129. };
  130.  
  131. WORD loadmore(struct FMHandle*,struct STL*);
  132. void textscrollup(struct STL*,WORD);
  133. void textscrolldown(struct STL*,WORD);
  134. WORD textup(struct STL*);
  135. WORD textdown(struct STL*);
  136. void infoblock(struct STL*,WORD,WORD);
  137.  
  138. WORD showtext(struct FMHandle *h,struct CMenuConfig *cmc)
  139. {
  140. struct STL stl;
  141. struct BitMap *bitmap=0,*vbitmap=0,*cbitmap=0;
  142. struct FMList *list;
  143. struct STN *stn;
  144. struct IntuiMessage *im;
  145. struct InputEvent ie;
  146.  
  147. WORD err=0, outputted=0;
  148. WORD apu1;
  149. #ifndef V39
  150. WORD apu2;
  151. #endif
  152. WORD quit=0,mode=0,omode=0,ignorebutton=0,started=1,keypressed=0;
  153. UBYTE chartab[2];
  154. ULONG class;
  155. UWORD code;
  156. UWORD qualifier;
  157. ULONG point;
  158. WORD penlist[2];
  159.  
  160. penlist[0]=-1;penlist[1]=-1;
  161. list=h->owner;
  162. ie.ie_Class=IECLASS_RAWKEY;
  163. ie.ie_SubClass=0;
  164. priority(cmc);
  165. changename(list,cmc->label);
  166. memseti(&stl,0,sizeof(struct STL));
  167. NewList((struct List*)&stl);
  168.  
  169. if(cmc->cmenucount==SHOWASCCONFIG) {
  170.     sformat(list->fmmessage1,getstring(MSG_FILECLICK_ASC),h->filename);
  171.     stl.flag=1;
  172. } else {
  173.     sformat(list->fmmessage1,getstring(MSG_FILECLICK_HEX),h->filename);
  174. }
  175. fmmessage(list);
  176. stl.color1=1;
  177. stl.remain=h->size;
  178. fmconfig->textscreen.height=(fmconfig->textscreen.height/fmmain.txtshowysize)*fmmain.txtshowysize;
  179. stl.numlines=fmconfig->textscreen.height/fmmain.txtshowysize;
  180. stl.numrows=fmconfig->textscreen.width/fmmain.txtshowxsize;
  181. stl.scroll=fmmain.txtshowysize; stl.height=fmconfig->textscreen.height*2+3*fmmain.txtshowysize;
  182. stl.scrollvalue=1; stl.handle=h; stl.config=getconfig(cmc);
  183. if(!stl.config) goto sterr;
  184. if(!(stl.ascbuffer=allocvec(h->owner,h->bufsize*4,0))) goto sterr;
  185. stl.rows=stl.numrows;
  186. if (stl.flag) {
  187.     stl.xx=0;
  188. } else {
  189.     stl.hexrows=stl.numrows/3-1;
  190.     if(stl.hexrows&1) stl.hexrows--;
  191.     stl.xx=(stl.numrows-stl.hexrows*3+1)/2*fmmain.txtshowxsize;
  192. }
  193. if (!(stl.buffer=allocvec(h->owner,stl.numrows,0))) goto sterr;
  194.  
  195. #ifdef V39
  196. if(!(bitmap=AllocBitMap(fmconfig->textscreen.width,stl.height,fmconfig->textscreen.depth,BMF_CLEAR|BMF_DISPLAYABLE,0))) {
  197.     requestmsg(list->workname,0,MSG_OK,MSG_MAIN_ERRNOBITMAP);
  198.     goto sterr;
  199. }
  200. if(!(vbitmap=AllocBitMap(fmconfig->textscreen.width,fmmain.txtshowysize,fmconfig->textscreen.depth,BMF_CLEAR,0))) {
  201.     requestmsg(list->workname,0,MSG_OK,MSG_MAIN_ERRNOBITMAP);
  202.     goto sterr;
  203. }
  204. if(!(cbitmap=AllocBitMap(fmconfig->textscreen.width,fmconfig->textscreen.height,fmconfig->textscreen.depth,BMF_CLEAR,0))) {
  205.     requestmsg(list->workname,0,MSG_OK,MSG_MAIN_ERRNOBITMAP);
  206.     goto sterr;
  207. }
  208. #else
  209. if (!(bitmap=allocvec(h->owner,sizeof(struct BitMap),0))) goto sterr;
  210. if (!(vbitmap=allocvec(h->owner,sizeof(struct BitMap),0))) goto sterr;
  211. if (!(cbitmap=allocvec(h->owner,sizeof(struct BitMap),0))) goto sterr;
  212. InitBitMap(bitmap,fmconfig->textscreen.depth,fmconfig->textscreen.width,stl.height);
  213. InitBitMap(vbitmap,fmconfig->textscreen.depth,fmconfig->textscreen.width,fmmain.txtshowysize);
  214. InitBitMap(cbitmap,fmconfig->textscreen.depth,fmconfig->textscreen.width,fmconfig->textscreen.height);
  215. apu2=1;
  216. for(apu1=0;apu1<fmconfig->textscreen.depth;apu1++) {
  217.     if(!(bitmap->Planes[apu1]=AllocRaster(fmconfig->textscreen.width,stl.height))) 
  218.         apu2=0;
  219.         else
  220.         BltClear(bitmap->Planes[apu1],RASSIZE(fmconfig->textscreen.width,stl.height),1);
  221.     if(!(vbitmap->Planes[apu1]=AllocRaster(fmconfig->textscreen.width,fmmain.txtshowysize))) apu2=0;
  222.     if(!(cbitmap->Planes[apu1]=AllocRaster(fmconfig->textscreen.width,fmconfig->textscreen.height))) apu2=0;
  223. }
  224. if (!apu2) goto sterr;
  225. #endif
  226.  
  227. if (!(stl.screen=OpenScreenTags(0,
  228.     SA_Left,0,SA_Top,0,
  229.     SA_Width,fmconfig->textscreen.width,SA_Height,fmconfig->textscreen.height,
  230.     SA_Depth,fmconfig->textscreen.depth,SA_Font,&fmconfig->txtshowfontattr,
  231.     SA_Type,CUSTOMSCREEN,SA_DisplayID,fmconfig->textscreen.screenmode,
  232.     SA_BitMap,bitmap,SA_ShowTitle,0,SA_Quiet,1,SA_Pens,penlist,
  233.     SA_AutoScroll,0,SA_Interleaved,1,
  234.     TAG_DONE))) {
  235.     requestmsg(list->workname,0,MSG_OK,MSG_MAIN_SCRERR1);
  236.     goto sterr;
  237. }
  238. stl.bitmap=bitmap; stl.vbitmap=vbitmap; stl.cbitmap=cbitmap;
  239. stl.screen->ViewPort.RasInfo->RyOffset=stl.scroll;
  240. ScrollVPort(&stl.screen->ViewPort);
  241. SetAPen(&stl.screen->RastPort,fmconfig->txtpen);
  242.  
  243. if (!(stl.window=OpenWindowTags(0,
  244.     WA_Left,0,WA_Top,4,
  245.     WA_Width,fmconfig->textscreen.width,WA_Height,fmconfig->textscreen.height-4,
  246.     WA_IDCMP,IDCMP_MOUSEMOVE|IDCMP_RAWKEY|IDCMP_MOUSEBUTTONS|IDCMP_ACTIVEWINDOW|IDCMP_INACTIVEWINDOW,
  247.     WA_Flags,WFLG_BACKDROP|WFLG_BORDERLESS|WFLG_ACTIVATE|WFLG_NOCAREREFRESH|WFLG_RMBTRAP|WFLG_REPORTMOUSE,
  248.     WA_CustomScreen,stl.screen,WA_RptQueue,1
  249.     ,TAG_DONE))) {
  250.     requestmsg(list->workname,0,MSG_OK,MSG_MAIN_WINERR1);
  251.     goto sterr;
  252. }
  253. err=1;
  254.  
  255. while(!quit) {
  256.     if (!mode&&!omode&&stl.loaded==0) {
  257.         stl.loaded=loadmore(h,&stl);
  258.         if(stl.loaded) {
  259.             freemem(stl.ascbuffer);
  260.             stl.ascbuffer=0;
  261.         }
  262.         mode=10;
  263.     }
  264.     if (!outputted&&stl.numlines&&stl.lines>0) {
  265.         stl.usenode2=stl.head; stl.usenode1=stl.head;
  266.         stl.pointer2=0;stl.pointer1=0;
  267.         stl.topline=-stl.numlines;
  268.         stn=stl.usenode2; point=stl.pointer2;
  269.         stl.firstinfo=0;
  270.         for(apu1=0;apu1<stl.numlines;apu1++) textscrollup(&stl,-1);
  271.         stl.usenode2=stn; stl.pointer2=point;
  272.         outputted=1;
  273.     }
  274.     im=(struct IntuiMessage*)GetMsg(stl.window->UserPort);
  275.     if(!im&&!mode&&stl.loaded) {
  276.         Wait(1L<<stl.window->UserPort->mp_SigBit);
  277.     }
  278.     if(im) {
  279.         class=im->Class;
  280.         code=im->Code;
  281.         qualifier=im->Qualifier;
  282.         if(ignorebutton) ignorebutton--;
  283.  
  284.         switch(class)
  285.         {
  286.         case IDCMP_INACTIVEWINDOW:
  287.         mode=0;
  288.         break;
  289.         case IDCMP_ACTIVEWINDOW:
  290.         if(!started) ignorebutton=2; else started=0;
  291.         break;
  292.         case IDCMP_MOUSEBUTTONS:
  293.         if(code==SELECTDOWN&&!ignorebutton) quit=1;
  294.         if(code==MENUDOWN&&!ignorebutton) { quit=1; err=0; }
  295.         break;
  296.         case IDCMP_MOUSEMOVE:
  297.         if(keypressed) break;
  298.         if(im->MouseY<64) { mode=1;break; }
  299.         if(im->MouseY>stl.window->Height-64) { mode=2;break;}
  300.         mode=0;
  301.         break;
  302.         case IDCMP_RAWKEY:
  303.             switch(code)
  304.             {
  305.             case 0x2e:
  306.             keypressed=1;
  307.             quit=1;
  308.             break;
  309.             case 0x4c:
  310.             case 0x3e:
  311.             keypressed=1;
  312.             mode=1;
  313.             break;
  314.             case 0x4d:
  315.             case 0x1e:
  316.             keypressed=1;
  317.             mode=2;
  318.             break;
  319.             case 0x80+0x4c:
  320.             case 0x80+0x3e:
  321.             case 0x80+0x4d:
  322.             case 0x80+0x1e:
  323.             case 0x80+0x3f:
  324.             case 0x80+0x1f:
  325.             case 0x80+0x3d:
  326.             case 0x80+0x1d:
  327.             keypressed=0;
  328.             mode=0;
  329.             break;
  330.             case 0x4f:
  331.             case 0x2d:
  332.             keypressed=1;
  333.             if (mode==3||mode==4) mode=0; else mode=3;
  334.             break;
  335.             case 0x4e:
  336.             case 0x2f:
  337.             keypressed=1;
  338.             if (mode==4||mode==3) mode=0; else mode=4;
  339.             break;
  340.             case 0x3f:    //pageup
  341.             mode=5;
  342.             break;
  343.             case 0x1f:    //pagedown
  344.             mode=6;
  345.             break;
  346.             case 0x3d:    //home
  347.             mode=7;
  348.             break;
  349.             case 0x1d:    //end
  350.             mode=8;
  351.             break;
  352.             default:
  353.             ie.ie_Code=code;
  354.             ie.ie_Qualifier=qualifier;
  355.             ie.ie_EventAddress=(APTR*)*((ULONG*)im->IAddress);
  356.             if (MapRawKey(&ie,chartab,2,0)==1) {
  357.                 switch(ToUpper(chartab[0]))
  358.                 {
  359.                 case 'J':
  360.                 mode=9;
  361.                 break;
  362.                 case 'S':
  363.                 mode=11;
  364.                 break;
  365.                 case 27:
  366.                 err=0;
  367.                 case 0x0d:
  368.                 quit=1;
  369.                 break;
  370.                 }
  371.             }
  372.             break;
  373.             }
  374.         }
  375.     ReplyMsg((struct Message*)im); im=0;
  376.     }
  377.     if (mode!=omode) {
  378.         if(!mode) infoblock(&stl,stl.scroll,1);
  379.         if(mode&&!omode) {
  380.             WaitTOF();
  381.             infoblock(&stl,stl.scroll,0);
  382.         }
  383.         omode=mode;
  384.     }
  385.     switch(mode)
  386.     {
  387.     case 1:    //fast down
  388.     textscrolldown(&stl,0);
  389.     break;
  390.     case 2:    //fast up
  391.     textscrollup(&stl,0);
  392.     break;
  393.     case 3:    //slow down
  394.     textscrolldown(&stl,1);
  395.     break;
  396.     case 4:    //slow up
  397.     textscrollup(&stl,1);
  398.     break;
  399.     case 5: //page down
  400.     for(apu1=1;apu1<stl.numlines;apu1++) textscrolldown(&stl,-1);
  401.     break;
  402.     case 6: //page up
  403.     for(apu1=1;apu1<stl.numlines;apu1++) textscrollup(&stl,-1);
  404.     break;
  405.     case 7: //home
  406.     stl.usenode2=stl.head; stl.usenode1=stl.head;
  407.     stl.pointer2=0;stl.pointer1=0;
  408.     stl.topline=-stl.numlines;
  409.     for(apu1=0;apu1<stl.numlines;apu1++) textscrollup(&stl,-1);
  410.     stl.usenode2=stl.head; stl.pointer2=0;
  411.     stl.firstinfo=0;
  412.     break;
  413.     case 8: //end
  414.     stl.usenode1=stl.usenode2=(struct STN*)&stl.tail;
  415.     stl.pointer1=stl.pointer2=0;
  416.     stl.topline=stl.lines;
  417.     for(apu1=0;apu1<stl.numlines;apu1++) textscrolldown(&stl,-1);
  418.     stl.usenode1=(struct STN*)&stl.tail; stl.pointer1=0;
  419.     stl.firstinfo=0;
  420.     break;
  421.     case 9: //jump
  422.     getjump(&stl);
  423.     mode=0;
  424.     break;
  425.     case 10: //infoblock
  426.     mode=0;
  427.     break;
  428.     case 11: //search
  429.     textsearch(&stl,qualifier);
  430.     mode=0;
  431.     break;
  432.     }    
  433. }
  434.  
  435. sterr:
  436. while(stl.head->succ) {
  437.     stn=stl.head;
  438.     Remove((struct Node*)stn);
  439.     freemem((struct Node*)stn);
  440. }
  441. freemem(stl.buffer);
  442. freemem(stl.ascbuffer);
  443. WaitBlit();
  444. if (stl.window) CloseWindow(stl.window);
  445. if (stl.screen) CloseScreen(stl.screen);
  446. #ifdef V39
  447. FreeBitMap(bitmap);
  448. FreeBitMap(vbitmap);
  449. FreeBitMap(cbitmap);
  450. #else
  451. if (bitmap) {
  452.     for(apu1=0;apu1<fmconfig->textscreen.depth;apu1++) {
  453.         if(bitmap->Planes[apu1]) FreeRaster(bitmap->Planes[apu1],fmconfig->textscreen.width,stl.height);
  454.         if(vbitmap->Planes[apu1]) FreeRaster(vbitmap->Planes[apu1],fmconfig->textscreen.width,fmmain.txtshowysize);
  455.         if(cbitmap->Planes[apu1]) FreeRaster(cbitmap->Planes[apu1],fmconfig->textscreen.width,fmconfig->textscreen.height);
  456.     }
  457.     freemem(bitmap);
  458.     freemem(vbitmap);
  459.     freemem(cbitmap);
  460. }
  461. #endif
  462. return(err);
  463. }
  464.  
  465.  
  466. WORD loadmore(struct FMHandle *h,struct STL *stl)
  467. {
  468. LONG len,apu1;
  469. struct STN *stn;
  470. WORD apu12;
  471. UBYTE *ptr1,*ptr2,*ptr3;
  472.  
  473. len=h->bufsize; if(stl->remain<len) len=stl->remain;
  474. if (readbufferfile(h,h->buffer,len)!=len||!len) return(1);
  475.  
  476. ptr1=h->buffer;
  477. ptr3=stl->ascbuffer;
  478. while(len>0) {
  479.     if(stl->flag) {
  480.         ptr2=ptr1;
  481.         while(--len>0&&*ptr2!=0&&*ptr2!=0x0a) ptr2++;
  482.         ptr2++;
  483.         apu12=ptr2-ptr1;
  484.         if(apu12>stl->handle->bufsize) return(1);
  485.         if(len<=0&&stl->remain>apu12) break;
  486.         *ptr3++=255;
  487.         convertstring(stl,ptr1,&ptr3,apu12);
  488.         ptr1=ptr2;
  489.     } else {
  490.          apu12=len;
  491.         if(apu12>stl->hexrows) apu12=stl->hexrows;
  492.         if(apu12>stl->handle->bufsize) return(1);
  493.         if(apu12<stl->hexrows&&stl->remain>apu12) break;
  494.         *ptr3++=255;
  495.         ptr3+=hexconvert(ptr1,ptr3,apu12,stl->hexrows);
  496.         *ptr3++=0;
  497.         ptr1+=apu12;
  498.         len-=apu12;
  499.     }
  500.     stl->remain-=apu12;
  501.     stl->lines++;
  502.     stl->bytes+=apu12;
  503.     if(!stl->remain) {
  504.         *ptr3++=255; *ptr3++=0;
  505.         apu1=stl->lines+1;
  506.         while(apu1<stl->numlines) {
  507.             apu1++;
  508.             *ptr3++=255; *ptr3++=0;
  509.         }
  510.     }
  511.     apu12=0;
  512. }    
  513. apu1=ptr3-stl->ascbuffer;
  514. if (!(stn=allocvec(h->owner,sizeof(struct STN)+apu1,MEMF_CLEAR))) return(1);
  515. stn->databytes=apu1;
  516. CopyMem(stl->ascbuffer,&(stn->buffer),stn->databytes);
  517. if (seek(h,-apu12,OFFSET_CURRENT)<0) {
  518.     freemem(stn);
  519.     return(1);
  520. }
  521. if((struct List*)stl->head->succ&&!stl->usenode1->succ) {
  522.     stl->usenode1=stl->usenode1->pred;
  523.     AddTail((struct List*)stl,(struct Node*)stn);
  524.     stl->usenode1=stl->usenode1->succ;
  525. } else {
  526.     AddTail((struct List*)stl,(struct Node*)stn);
  527. }
  528. return(0);
  529. }
  530.  
  531. void escmode(struct STL *stl,UBYTE **ssrc,UBYTE **ddst,WORD *slen)
  532. {
  533. UBYTE *src,*dst;
  534. UBYTE cha1,cha2;
  535. UBYTE vstyle,vcolor1,vcolor2;
  536. WORD len;
  537.  
  538. // first byte = 1 | style<<1
  539. // second byte = 1 | color1<<5|color2<<1
  540.  
  541. src=*ssrc;
  542. dst=*ddst;
  543. len=*slen;
  544. vstyle=stl->style;
  545. vcolor1=stl->color1;
  546. vcolor2=stl->color2;
  547. cha1=*src++; len--;
  548. if(cha1>='0'&&cha1<='9'&&(*src==';'||*src=='m')) {
  549.     switch(cha1)
  550.     {
  551.     case '0':
  552.     vstyle=0;
  553.     vcolor1=1;
  554.     vcolor2=0;
  555.     break;
  556.     case '1':
  557.     vstyle|=2;
  558.     break;
  559.     case '3':
  560.     vstyle|=4;
  561.     break;
  562.     case '4':
  563.     vstyle|=1;
  564.     break;
  565.     case '7':
  566.     vstyle|=8;
  567.     break;
  568.     }
  569.     cha1=*src++; len--;
  570.     if(cha1=='m') {
  571.         escstyle(&dst,&stl->style,vstyle,&stl->color1,vcolor1,&stl->color2,vcolor2);
  572.         goto escend;
  573.     }
  574.     if(cha1!=';') return;
  575.     cha1=*src++; len--;
  576. }
  577. if(cha1=='3'||cha1=='4') {
  578.     cha2=*src++; len--;
  579.     if(cha2=='9') {
  580.         if(cha1=='3')
  581.             vcolor1=1;
  582.             else
  583.             vcolor2=0;
  584.     } else {
  585.         if(cha2<'0'||cha2>'7') return;
  586.         if(cha1=='3') 
  587.             vcolor1=cha2-'0';
  588.             else
  589.             vcolor2=cha2-'0';
  590.     }
  591.     cha1=*src++; len--;
  592.     if(cha1=='m') {
  593.         escstyle(&dst,&stl->style,vstyle,&stl->color1,vcolor1,&stl->color2,vcolor2);
  594.         goto escend;
  595.     }
  596. } else {
  597.     return;
  598. }
  599. if(cha1!=';') return;
  600. cha1=*src++; len--;
  601. if(cha1=='3'||cha1=='4') {
  602.     cha2=*src++; len--;
  603.     if(cha2<'0'||cha2>'7') return;
  604.     if(cha1=='3') 
  605.         vcolor1=cha2-'0';
  606.         else
  607.         vcolor2=cha2-'0';
  608.     cha1=*src++; len--;
  609.     if(cha1!='m') return;
  610.     escstyle(&dst,&stl->style,vstyle,&stl->color1,vcolor1,&stl->color2,vcolor2);
  611. }
  612. escend:
  613. *ssrc=src;
  614. *ddst=dst;
  615. *slen=len;
  616. }
  617.  
  618. void escstyle(UBYTE **ddst,UBYTE *s,UBYTE vs,UBYTE *c1,UBYTE vc1,UBYTE *c2,UBYTE vc2)
  619. {
  620. UBYTE *dst;
  621.  
  622. dst=*ddst;
  623. if(*s==vs&&*c1==vc1&&*c2==vc2) {
  624.     return;
  625. } else {
  626.     *s=vs;
  627.     *c1=vc1;
  628.     *c2=vc2;
  629.     *dst++=1|vs<<1;
  630.     *dst++=1|vc2<<5|vc1<<1;
  631.     *dst=0;
  632. }
  633. *ddst=dst;
  634. }
  635.  
  636. void convertstring(struct STL *stl,UBYTE *src,UBYTE **ddst,WORD len)
  637. {
  638. UBYTE *dst;
  639. UWORD cha1;
  640. WORD tabsize=8;
  641. WORD tabber=tabsize;
  642.  
  643. dst=*ddst;
  644. while(len>0) {
  645.     cha1=*src++; len--;
  646.     if(cha1>=32) {
  647.         *dst++=cha1;
  648.         tabber--;
  649.         if(!tabber) tabber=tabsize;
  650.         continue;
  651.     }
  652.     if(cha1==0x0d) continue;
  653.     if(cha1==0x09) {
  654.         while(tabber--) *dst++=0x20;
  655.         tabber=tabsize;
  656.         continue;
  657.     }
  658.     if(cha1==0x1b&&*src=='[') {
  659.         len--; src++;
  660.         escmode(stl,&src,&dst,&len);
  661.         continue;
  662.     }
  663. }
  664. *dst++=32;
  665. *dst++=0; *ddst=dst;
  666. }
  667.  
  668. WORD textup(struct STL *stl)
  669. {
  670. LONG cnt1,cnt2;
  671. struct STN *un1,*un2;
  672. LONG uptr1,uptr2;
  673.  
  674. un1=stl->usenode1;
  675. un2=stl->usenode2;
  676. uptr1=stl->pointer1;
  677. uptr2=stl->pointer2;
  678.  
  679. if(!un1->succ) return(0);
  680.  
  681. cnt1=strlen(&(un1->buffer)+uptr1)+1;
  682. cnt2=strlen(&(un2->buffer)+uptr2)+1;
  683.  
  684. uptr1+=cnt1;
  685. if(uptr1>=un1->databytes) {
  686.     un1=un1->succ;
  687.     uptr1=0;
  688. }
  689. uptr2+=cnt2;
  690. if(uptr2>=un2->databytes) {
  691.     un2=un2->succ;
  692.     uptr2=0;
  693. }
  694. stl->pointer1=uptr1;
  695. stl->pointer2=uptr2;
  696. stl->usenode1=un1;
  697. stl->usenode2=un2;
  698. stl->topline++;
  699.  
  700. return(1);
  701. }
  702.  
  703.  
  704. void textscrollup(struct STL *stl,WORD smooth)
  705. {
  706. struct STN *stn;
  707. struct RastPort *rp;
  708. WORD yy,apu1,apu2,apu3;
  709. extern UBYTE space[];
  710.  
  711. rp=&(stl->screen->RastPort);
  712.  
  713. if(!stl->usenode1->succ) return;
  714.  
  715. stn=stl->usenode1;
  716. yy=stl->scroll-fmmain.txtshowysize;
  717. Move(rp,stl->xx,yy+fmmain.txtshowbaseline);
  718. strtext(stl,rp,&(stn->buffer)+stl->pointer1);
  719. BltBitMap(rp->BitMap,0,yy,rp->BitMap,0,stl->scroll+fmconfig->textscreen.height,fmconfig->textscreen.width,fmmain.txtshowysize,0xc0,0xff,0);
  720. textup(stl);
  721. apu2=fmmain.txtshowysize; if (smooth==1) apu2=stl->scrollvalue;
  722. for(apu1=0;apu1!=fmmain.txtshowysize;apu1+=apu2) {
  723.     if(stl->config&&stl->config->showinfo&&smooth>=0) infoblock(stl,stl->scroll,1);
  724.     apu3=stl->scroll;
  725.     stl->scroll+=apu2;
  726.     if(stl->scroll==fmconfig->textscreen.height+2*fmmain.txtshowysize) stl->scroll=fmmain.txtshowysize;
  727.     stl->screen->ViewPort.RasInfo->RyOffset=stl->scroll;
  728.     if(smooth>=0) while(VBeamPos()<32);
  729.     ScrollVPort(&(stl->screen->ViewPort));
  730.     if(smooth>=0) {
  731.         WaitTOF();
  732.         if(stl->config->showinfo) infoblock(stl,apu3,0);
  733.     }
  734. }
  735. stl->newsearch=0;
  736. }
  737.  
  738. WORD textdown(struct STL *stl)
  739. {
  740. LONG cnt1,cnt2;
  741. UBYTE *ptr1,*ptr2;
  742. struct STN *un1,*un2;
  743. LONG uptr1,uptr2;
  744.  
  745. un1=stl->usenode1;
  746. un2=stl->usenode2;
  747. uptr1=stl->pointer1;
  748. uptr2=stl->pointer2;
  749.  
  750. if(!un2->pred->pred&&!uptr2) return(0);
  751.  
  752.  
  753. if (!uptr2) {
  754.     un2=un2->pred;
  755.     uptr2=un2->databytes;
  756. }
  757. if (!uptr1) {
  758.     un1=un1->pred;
  759.     uptr1=un1->databytes;
  760. }
  761. ptr2=&(un1->buffer);
  762. ptr1=ptr2+uptr1-1;
  763. while(ptr1!=ptr2&&*--ptr1);
  764. cnt1=ptr2+uptr1-ptr1;
  765. if(ptr1!=ptr2) cnt1--;
  766. ptr2=&(un2->buffer);
  767. ptr1=ptr2+uptr2-1;
  768. while(ptr1!=ptr2&&*--ptr1);
  769. cnt2=ptr2+uptr2-ptr1;
  770. if(ptr1!=ptr2) cnt2--;
  771.  
  772. uptr2-=cnt2;
  773. uptr1-=cnt1;
  774. stl->pointer1=uptr1;
  775. stl->pointer2=uptr2;
  776. stl->usenode1=un1;
  777. stl->usenode2=un2;
  778. stl->topline--;
  779. return(1);
  780. }
  781.  
  782. void textscrolldown(struct STL *stl,WORD smooth)
  783. {
  784. struct STN *stn;
  785. struct RastPort *rp;
  786. WORD yy,apu1,apu2,apu3;
  787.  
  788. rp=&(stl->screen->RastPort);
  789.  
  790.  
  791. if(!stl->usenode2->pred->pred&&!stl->pointer2) return;
  792.  
  793. textdown(stl);
  794. stn=stl->usenode2;
  795. yy=stl->scroll-fmmain.txtshowysize;
  796. Move(rp,stl->xx,yy+fmmain.txtshowbaseline);
  797. strtext(stl,rp,&(stn->buffer)+stl->pointer2);
  798. BltBitMap(rp->BitMap,0,yy,rp->BitMap,0,stl->scroll+fmconfig->textscreen.height,fmconfig->textscreen.width,fmmain.txtshowysize,0xc0,0xff,0);
  799.  
  800. apu2=fmmain.txtshowysize; if (smooth==1) apu2=stl->scrollvalue;
  801. for(apu1=0;apu1!=fmmain.txtshowysize;apu1+=apu2) {
  802.     if(stl->config->showinfo&&smooth>=0) infoblock(stl,stl->scroll,1);
  803.     apu3=stl->scroll;
  804.     stl->scroll-=apu2;
  805.     if(!stl->scroll) stl->scroll=fmconfig->textscreen.height+fmmain.txtshowysize;
  806.     stl->screen->ViewPort.RasInfo->RyOffset=stl->scroll;
  807.     if(smooth>=0) while(VBeamPos()<32);
  808.     ScrollVPort(&(stl->screen->ViewPort));
  809.     if(smooth>=0) {
  810.         WaitTOF();
  811.         if(stl->config->showinfo) infoblock(stl,apu3,0);
  812.     }
  813. }
  814. stl->newsearch=0;
  815. }
  816.  
  817. void strtext(struct STL *stl,struct RastPort *rp,UBYTE *txt)
  818. {
  819. WORD len2=0,len,yy;
  820. UBYTE *ptr;
  821. UBYTE *hili;
  822. extern UBYTE space[];
  823.  
  824. hili=txt; txt++;
  825. while(*txt) {
  826.     if(*txt<32&&*txt>=0) {
  827.         stl->style=*txt>>1;
  828.         if(stl->style&8) SetDrMd(rp,JAM2|INVERSVID); else SetDrMd(rp,JAM2);
  829.         SetSoftStyle(rp,stl->style,7);
  830.         txt++;
  831.         stl->color1=(*txt>>1)&0x07;
  832.         SetAPen(rp,stl->color1);
  833.         stl->color2=*txt>>5;
  834.         SetBPen(rp,stl->color2);
  835.         txt++;
  836.     } else {
  837.         ptr=txt;
  838.         while(*ptr>=32) ptr++;
  839.         len=ptr-txt;
  840.         if((len+len2)<stl->rows)
  841.             Text(rp,txt,ptr-txt);
  842.             else
  843.             Text(rp,txt,stl->rows-len2);
  844.         len2+=len;
  845.         txt=ptr;
  846.         if(len2>=stl->rows) break;
  847.     }
  848. }
  849. if(len2<stl->rows) {
  850.     SetDrMd(rp,JAM2);
  851.     Text(rp,space,stl->rows-len2);
  852.     if(stl->style&8) SetDrMd(rp,JAM2|INVERSVID);
  853. }
  854. if(*hili!=255) {
  855.     yy=stl->scroll-fmmain.txtshowysize;
  856.     SetDrMd(rp,COMPLEMENT);
  857.     RectFill(rp,0,yy,stl->numrows*fmmain.txtshowxsize,yy+fmmain.txtshowysize);
  858.     SetDrMd(rp,JAM2);
  859.     *hili=255;
  860. }
  861. }
  862.  
  863.  
  864. void infoblock(struct STL *stl,WORD yy,WORD type)
  865. {
  866. UBYTE text[200];
  867. WORD cnt;
  868. struct RastPort *rp;
  869. LONG apu,prose;
  870.  
  871. yy+=stl->screen->Height-fmmain.txtshowysize;
  872. rp=&(stl->screen->RastPort);
  873. if (type) {
  874.     BltBitMap(stl->bitmap,0,yy,stl->vbitmap,0,0,fmconfig->textscreen.width,fmmain.txtshowysize,0xc0,0xff,0);
  875.     apu=stl->topline;
  876.     if (stl->topline<0) apu=0;
  877.     prose=100;
  878.     if(stl->lines) prose=(LONG)(apu+stl->numlines)*(LONG)100/(LONG)stl->lines;
  879.     if(prose>100) prose=100;
  880.     if (!stl->loaded) {
  881.         if(stl->handle->size)
  882.             sformat(text,getstring(MSG_SHOWTEXTINFO1),stl->handle->filename,apu,stl->lines,prose,stl->bytes*100/stl->handle->size);
  883.             else
  884.             sformat(text,getstring(MSG_SHOWTEXTINFO1),stl->handle->filename,apu,stl->lines,prose,100);
  885.     } else {
  886.         sformat(text,getstring(MSG_SHOWTEXTINFO2),stl->handle->filename,apu,stl->lines,prose);
  887.     }
  888.     cnt=strlen(text);
  889.     while(cnt<stl->numrows) text[cnt++]=32;
  890.     SetAPen(rp,fmconfig->whitepen);
  891.     SetBPen(rp,fmconfig->blackpen);
  892.     SetSoftStyle(rp,0,7);
  893.     SetDrMd(rp,JAM2|INVERSVID);
  894.     Move(rp,0,yy+fmmain.txtshowbaseline);
  895.     cnt=strlen(text);
  896.     if(cnt>stl->numrows) cnt=stl->numrows;
  897.     Text(rp,text,cnt);    
  898.     if(stl->style&8) SetDrMd(rp,JAM2|INVERSVID); else SetDrMd(rp,JAM2);
  899.     SetAPen(rp,stl->color1);
  900.     SetBPen(rp,stl->color2);
  901.     stl->firstinfo=1;
  902. } else {
  903.     if(stl->firstinfo) {
  904.         BltBitMap(stl->vbitmap,0,0,stl->bitmap,0,yy,fmconfig->textscreen.width,fmmain.txtshowysize,0xc0,0xff,0);
  905.     }
  906. }
  907. }
  908.  
  909. void setreqstate(struct STL *stl)
  910. {
  911. WaitTOF();
  912. BltBitMap(stl->bitmap,0,0,stl->cbitmap,0,0,fmconfig->textscreen.width,fmconfig->textscreen.height,0xc0,0xff,0);
  913. BltBitMap(stl->bitmap,0,stl->scroll,stl->bitmap,0,0,fmconfig->textscreen.width,fmconfig->textscreen.height,0xc0,0xff,0);
  914. WaitBlit();
  915. stl->screen->ViewPort.RasInfo->RyOffset=0;
  916. ScrollVPort(&(stl->screen->ViewPort));
  917. infoblock(stl,0,1);
  918. }
  919. void resetreqstate(struct STL *stl)
  920. {
  921. infoblock(stl,0,0);
  922. WaitTOF();
  923. BltBitMap(stl->cbitmap,0,0,stl->bitmap,0,0,fmconfig->textscreen.width,fmconfig->textscreen.height,0xc0,0xff,0);
  924. WaitBlit();
  925. stl->screen->ViewPort.RasInfo->RyOffset=stl->scroll;
  926. ScrollVPort(&(stl->screen->ViewPort));
  927. }
  928.  
  929. void getjump(struct STL *stl)
  930. {
  931. WORD apu1;
  932. LONG linecnt;
  933. struct STN *stn;
  934. LONG point;
  935. LONG value;
  936.  
  937. setreqstate(stl);
  938. value=stl->topline;
  939. if(asklong(stl->screen,stl->handle->owner->workname,getstring(MSG_SHOWTEXT_LINENUMBER),&value,0,stl->lines)) {
  940. #ifdef V39
  941.     SetWindowPointer(stl->window,WA_BusyPointer,TRUE,WA_PointerDelay,TRUE,TAG_DONE);
  942. #endif
  943.     linecnt=value;
  944.     stl->topline=-stl->numlines;
  945.     if(linecnt>stl->lines-stl->numlines+1) linecnt=stl->lines-stl->numlines+1;
  946.     if(linecnt<0) linecnt=0;
  947.     stl->usenode2=stl->head; stl->usenode1=stl->head;
  948.     stl->pointer2=0;stl->pointer1=0;
  949.     stl->topline=-stl->numlines;
  950.     while(linecnt) {
  951.         linecnt--;
  952.         textup(stl);
  953.     }
  954.     resetreqstate(stl);
  955.     stn=stl->usenode2; point=stl->pointer2;
  956.     for(apu1=0;apu1<stl->numlines;apu1++) textscrollup(stl,-1);
  957.     stl->usenode2=stn; stl->pointer2=point;
  958.     stl->firstinfo=0;
  959. #ifdef V39
  960.     SetWindowPointer(stl->window,TAG_DONE);
  961. #endif
  962.     return;
  963. }
  964. resetreqstate(stl);
  965. }
  966.  
  967. void textsearch(struct STL *stl,WORD qualifier)
  968. {
  969. WORD apu1,len,ret;
  970. struct STN *stn;
  971. LONG point;
  972. UBYTE *varabuf;
  973. UBYTE *ptr1,*ptr2,*ptr3;
  974. LONG topline;
  975. #ifdef V39
  976. WORD mouse=0;
  977. #endif
  978.  
  979. varabuf=allocvec(stl->handle->owner,stl->handle->bufsize,0);
  980. if(!varabuf) return;
  981. ret=0;
  982. if(!(qualifier&0x80)||stl->searchstring[0]==0) {
  983.     setreqstate(stl);
  984.     ret=askstring(stl->screen,stl->handle->owner->workname,getstring(MSG_SHOWTEXT_SEARCHSTRING),stl->searchstring,sizeof(stl->searchstring));
  985.     resetreqstate(stl);
  986. }
  987. if((qualifier&0x80)||(ret&&stl->searchstring[0])) {
  988. #ifdef V39
  989.     SetWindowPointer(stl->window,WA_BusyPointer,TRUE,WA_PointerDelay,TRUE,TAG_DONE);
  990.     mouse=1;
  991. #endif
  992.     len=strlen(stl->searchstring);
  993.     if(stl->newsearch) {
  994.         for(apu1=0;apu1<stl->numlines;apu1++) textup(stl);
  995.         stl->newsearch=0;
  996.     }
  997.     stn=stl->usenode2;
  998.     point=stl->pointer2;
  999.     for(;;) {
  1000.         ptr1=ptr3=&(stn->buffer)+point;
  1001.         point+=strlen(ptr1)+1;
  1002.         ptr2=varabuf;
  1003.         while(*ptr1) {
  1004.             if(*ptr1<0||*ptr1>31) *ptr2++=*ptr1++; else ptr1+=2;
  1005.         }
  1006.         *ptr2=0; ptr2-=len;
  1007.         ptr1=varabuf;
  1008.         while(ptr1<ptr2) {
  1009.             if (Strnicmp(stl->searchstring,ptr1,len)==0) break;
  1010.             ptr1++;
  1011.         }    
  1012.         if(ptr1<ptr2) {
  1013.             *ptr3=10;
  1014.             break;
  1015.         }
  1016.         stl->topline++;
  1017.         if(point>=stn->databytes) {
  1018.             WaitTOF();
  1019.             infoblock(stl,0,0);
  1020.             infoblock(stl,0,1);
  1021.             stn=stn->succ; point=0;
  1022.         }
  1023.         if(!stn->succ) {
  1024.             DisplayBeep(stl->screen);
  1025.             break;
  1026.         }
  1027.     }
  1028.     topline=stl->topline-(stl->numlines+1)/2;
  1029.     if(topline>stl->lines-stl->numlines+1) topline=stl->lines-stl->numlines+1;
  1030.     if(topline<0) topline=0;
  1031.     stl->topline=-stl->numlines;
  1032.     stl->usenode2=stl->head; stl->usenode1=stl->head;
  1033.     stl->pointer2=0;stl->pointer1=0;
  1034.     while(topline) {
  1035.         topline--;
  1036.         textup(stl);
  1037.     }
  1038.     stn=stl->usenode2; point=stl->pointer2;
  1039.     for(apu1=0;apu1<stl->numlines;apu1++) textscrollup(stl,-1);
  1040.     stl->usenode2=stn; stl->pointer2=point;
  1041.     stl->newsearch=1;
  1042.     stl->firstinfo=0;
  1043. }
  1044. #ifdef V39
  1045.     if(mouse) SetWindowPointer(stl->window,TAG_DONE);
  1046. #endif
  1047. freemem(varabuf);
  1048. }
  1049.  
  1050. void *showtextconfigdefault(struct CMenuConfig *cmc)
  1051. {
  1052. struct ShowTxt *config;
  1053. WORD ret;
  1054.  
  1055. ret=allocconfig(cmc,sizeof(struct ShowTxt));
  1056. if(ret<0) return(cmc->moreconfig);
  1057. if(!ret) return(0);
  1058. config=(struct ShowTxt*)cmc->moreconfig;
  1059. config->showinfo=1;
  1060. return(cmc->moreconfig);
  1061. }
  1062.  
  1063. WORD showtextconfig(struct GUIBase *gb,struct CMenuConfig *cmc)
  1064. {
  1065. WORD si,c;
  1066. struct ShowTxt *config;
  1067.  
  1068. config=(struct ShowTxt*)showtextconfigdefault(cmc);
  1069. si=config->showinfo;
  1070. setguigroup(gb,1,0);
  1071. reqinfomsg(gb,MSG_SHOWTEXT_CONFIG_INFOLINE,200,guiUC|guiLEFT);
  1072. setguigroup(gb,2,0);
  1073. reqcycle2msg(gb,200,&si);
  1074. commandanswer(gb);
  1075. c=quickreq(gb);
  1076. config->showinfo=si;
  1077. return(c);
  1078. }
  1079.