home *** CD-ROM | disk | FTP | other *** search
/ Photo CD Demo 1 / Demo.bin / gle / gle / b_tab.c < prev    next >
C/C++ Source or Header  |  1992-11-29  |  2KB  |  108 lines

  1. #include "all.h"
  2. #include "mygraph.h"
  3. #include "justify.h"
  4. int g_get_font(int *f);
  5.  
  6. #define true (!false)
  7. #define false 0
  8. #define dbg if ((gle_debug & 32)>0)
  9. extern int gle_debug;
  10.  
  11. extern long *(*gpcode)[];   /* gpcode is a polonger to an array of poiter to long */
  12. extern long (*gplen)[];   /* gpcode is a pointer to an array of long */
  13. extern int ngpcode;
  14.  
  15. static double base_owidth;
  16. int g_textfindend(char *s, double *x, double *y);
  17. int tab_line(char *ss,char *outbuff);
  18. begin_tab(int *pln,long *pcode, int *cp)
  19. {
  20.     int sl,i,bl,cjust;
  21.     char *tabbuff;
  22.      char tbuff[200];
  23.      double zzz;
  24.     int save_fnt;
  25.     double save_hei;
  26.     g_get_font(&save_fnt);
  27.     g_get_hei(&save_hei);
  28.  
  29.     tabbuff = myalloc(5000);
  30.     bl = 0;
  31.     g_get_just(&cjust);
  32.     g_textfindend("o",&base_owidth,&zzz);
  33.     tabbuff[0] = 0;
  34.     for (i=0;;i++) {
  35.     dbg showpcode(pcode);
  36.     if (*(pcode+*cp-1)==0) { /* END XXX */
  37.         break;
  38.     }
  39.     sl = strlen((char *) (pcode+*cp));
  40.     strcpy(tbuff,(char *) (pcode+*cp));
  41.     if (i>1) {
  42.         tab_line(tbuff,tabbuff);
  43.     }
  44.     pcode = (*gpcode)[(*pln)++];
  45.     *cp = 2;
  46.     }
  47.     dbg printf("+_+_+_+_+_ %d {%s} \n",strlen(tabbuff),tabbuff);
  48.     g_set_font(save_fnt);
  49.     g_set_hei(save_hei);
  50.     (*pln)--;
  51.  
  52.        text_block(tabbuff,0.0,cjust);
  53.      myfree(tabbuff);
  54. }
  55. #define aspace(c) (c == ' ')
  56. tab_line(char *ss,char *tabbuff)
  57. {
  58.     double bl,br,bu,bd,swid;
  59.     char wbuff[100],str2[30];
  60.     char *s,*wb;
  61.     int i,c=0,cjust,savec,old_len;
  62.     swid = base_owidth;
  63.     old_len = strlen(tabbuff);
  64.     for (s=ss;*s!=0;) {
  65.         if (*s==9) {
  66.             c = (c/8)*8+8; s++;
  67.         } else {
  68.           if (aspace(*s))  {
  69.             c++; s++;
  70.           } else {
  71.             wb = wbuff;
  72.             savec = c;
  73.             for (;*s!=0  && !(*s==9)
  74.                 && !(isspace(*s) && isspace(*(s+1))) ;) {
  75.                 if (*s == '\\') if (*(s+1) != '\\') c -= 2;
  76.                 if (strchr("{}_^",*s)!=NULL) {
  77.                     *wb++ = '\\';
  78.                 }
  79.                 *wb++ = *s++; c++;
  80.             }
  81.             *wb++ = 0;
  82.             g_textfindend(wbuff,&br,&bd);
  83.             wb--;
  84.             sprintf(wb,"\\movexy{%g}{0}",-br-swid*savec);
  85.             sprintf(str2,"\\movexy{%g}{0}",swid*savec);
  86.             if (strlen(tabbuff)>3000) {
  87.                 gprint("Too much tabbing text in one section.\n");
  88.                 return;
  89.             }
  90.             strcat(tabbuff,str2);
  91.             strcat(tabbuff,wbuff);
  92.           }
  93.         }
  94.     }
  95.     if (strlen(tabbuff)==old_len)  strcat(tabbuff,"\\movexy{0}{0}");
  96.     strcat(tabbuff,"\n");
  97. }
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.