home *** CD-ROM | disk | FTP | other *** search
/ Creative Computers / CreativeComputers.iso / shareware / text / dvi_3.62 / source / dvisrc.lha / dvirddvi.c < prev    next >
C/C++ Source or Header  |  1993-10-26  |  8KB  |  374 lines

  1. /*
  2. ** Datei: DVIRDDVI.C
  3. ** Autor: Ingo Eichenseher
  4. */
  5.  
  6. #include <stdio.h>
  7. #include <stdarg.h>
  8. #ifdef __ATARIGNU__
  9. #include <osbind.h>
  10. #include <aesbind.h>
  11. #include <vdibind.h>
  12. #endif
  13. #include <errno.h>
  14. #include "dvi.h"
  15. #include "dvidef.h"
  16. #include "dvimisc.h"
  17.  
  18. #define MAX_DVI_STACK 16
  19.  
  20. FILE *log_file=NULL;
  21.  
  22. /*
  23. ** -------------------------------------------------------------------
  24. ** functions interpreting the dvi file
  25. ** -------------------------------------------------------------------
  26. */
  27.  
  28. #include <string.h>
  29. #ifdef ATARI_ST
  30. #ifdef __TURBOC__
  31. #include <tos.h>
  32. #endif
  33. #endif
  34.  
  35. typedef struct
  36. {
  37.     FILE    *dvi_file;
  38.     unsigned char huge *dvi_start;
  39.     unsigned char huge *dvi_end;
  40.     unsigned char huge *dvi_ptr;
  41. } dvi_stack_t;
  42.  
  43. static dvi_stack_t ds_data[MAX_DVI_STACK] = {{NULL,NULL}};
  44. static dvi_stack_t huge *ds = ds_data;
  45.  
  46. void dvi_fpush(FILE *new_file, byte *new_start, byte *new_end)
  47. {
  48.     if (++ds>=(dvi_stack_t huge*)ds_data+MAX_DVI_STACK)
  49.     {
  50.     halt("DVI Stack Overflow");
  51.     ds--;
  52.     }
  53.     ds->dvi_file = new_file;
  54.     ds->dvi_start = new_start;
  55.     ds->dvi_end = new_end;
  56.     ds->dvi_ptr = new_start;
  57. }
  58.  
  59. void dvi_fpop(void)
  60. {
  61.     if (ds<=(dvi_stack_t huge*)ds_data) halt("DVI Stack Underflow");
  62.     if (ds->dvi_file!=NULL)
  63.     {
  64.     xprint(-1,")");
  65.     fclose(ds->dvi_file);
  66.     ds->dvi_file = NULL;
  67.     }
  68.     ds--;
  69. }
  70.  
  71. int dvi_finit(char *name, char *path)
  72. {
  73.     char filename[MAX_PATH_LEN];
  74.     static int first_log = 1;
  75.  
  76.     dvi_fexit();
  77.  
  78.     if (*op.log_name!='\0')
  79.     {
  80.     log_file = fopen(op.log_name,first_log ? "w":"a");
  81.     if (log_file==NULL)
  82.         print("Warning: Cannot open LOG-File %s for output",op.log_name);
  83.     else first_log = 0;
  84.     }
  85.  
  86.     if (op.dvimemory)
  87.     {
  88.     long dvi_length;
  89.     FILE *fp;
  90.  
  91. #ifdef ATARI_ST
  92.     int handle;
  93. #endif
  94.  
  95.     ds->dvi_file = NULL;
  96.     if ( (fp = fopene(name,"rb",path,filename))==NULL) return 1;
  97.     printnnl("(%s",filename);
  98.     if (fseek(fp,0l,SEEK_END)) return 1;
  99.     dvi_length = ftell(fp);
  100.     if (dvi_length<1) return 1;
  101.  
  102. #ifdef ATARI_ST
  103.     handle = fileno(fp);
  104.     if (Fseek(0,handle,0)) return 1;
  105.     ds->dvi_start = mem_alloc(dvi_length,"DVI-File");
  106.     ds->dvi_end = (ds->dvi_ptr = ds->dvi_start) + dvi_length;
  107.     if ( dvi_length != Fread(handle,dvi_length,ds->dvi_start) )
  108.         return 1;
  109. #else
  110.     if (fseek(fp,0l,SEEK_SET)) return 1;
  111.     ds->dvi_start = mem_alloc(dvi_length,"DVI-File");
  112.     ds->dvi_end = (ds->dvi_ptr = ds->dvi_start) + dvi_length;
  113.     if ( dvi_length != fread((void*)ds->dvi_start,1,(size_t)dvi_length,fp) )
  114.         return 1;
  115. #endif
  116.     xprint(-1,":%ld)",dvi_length);
  117.     fclose(fp);
  118.     return 0;
  119.     }
  120.  
  121.     ds->dvi_file = fopene(name,"rb",path,filename);
  122.     if (ds->dvi_file!=NULL) printnnl("(%s",filename);
  123.     return ds->dvi_file == NULL;
  124. }
  125.  
  126. int dvi_fseek(long offset)
  127. {
  128.     if (ds->dvi_file==NULL)
  129.     {
  130.     ds->dvi_ptr = ds->dvi_start + offset;
  131.     return ds->dvi_ptr > ds->dvi_end || ds->dvi_ptr < ds->dvi_start;
  132.     }
  133.     return fseek(ds->dvi_file,offset,SEEK_SET);
  134. }
  135.  
  136. int dvi_fmove(long offset)
  137. {
  138.     if (ds->dvi_file==NULL)
  139.     {
  140.     ds->dvi_ptr += offset;
  141.     return ds->dvi_ptr > ds->dvi_end || ds->dvi_ptr < ds->dvi_start;
  142.     }
  143.     return fseek(ds->dvi_file,offset,SEEK_CUR);
  144. }
  145.  
  146. static int dvi_feof(void)
  147. {
  148.     if (ds->dvi_file==NULL)
  149.     {
  150.     ds->dvi_ptr = ds->dvi_end;
  151.     return 0;
  152.     }
  153.     return fseek(ds->dvi_file,0l,SEEK_END);
  154. }
  155.  
  156. void dvi_fexit(void)
  157. {
  158.     while(ds>=(dvi_stack_t huge*)ds_data)
  159.     {
  160.     if (ds->dvi_file!=NULL)
  161.     {
  162.         xprint(-1,")");
  163.         fclose(ds->dvi_file);
  164.         ds->dvi_file = NULL;
  165.     }
  166.     ds--;
  167.     }
  168.     ds = ds_data;
  169.     if (ds->dvi_start!=NULL)
  170.     {
  171.     mem_free(ds->dvi_start,ds->dvi_end-ds->dvi_start);
  172.     ds->dvi_start = NULL;
  173.     }
  174.     if (log_file!=NULL)
  175.     {
  176.     fclose(log_file);
  177.     log_file = NULL;
  178.     print("Transcript writton on %s",op.log_name);
  179.     }
  180. }
  181.  
  182. int dvi_fgetc(void)
  183. {
  184.     if (ds->dvi_file==NULL)
  185.     {
  186.     if (ds->dvi_ptr<ds->dvi_end) return (int)*ds->dvi_ptr++;
  187.     else return EOF;
  188.     }
  189.     return getc(ds->dvi_file);
  190. }
  191.  
  192. static long dvi_ftell(void)
  193. {
  194.     if (ds->dvi_file==NULL)
  195.     return ds->dvi_ptr-ds->dvi_start;
  196.     return ftell(ds->dvi_file);
  197. }
  198.  
  199. unsigned int dvi_fu2(void)
  200. {
  201.     int gw1, gw2;
  202.  
  203.     gw1 = dvi_fgetc();
  204.     gw2 = dvi_fgetc();
  205.     return ((unsigned)gw1<<8) | (unsigned)gw2;
  206. }
  207.  
  208. unsigned long dvi_fu3(void)
  209. {
  210.     int gw1, gw2, gw3;
  211.  
  212.     gw1 = dvi_fgetc();
  213.     gw2 = dvi_fgetc();
  214.     gw3 = dvi_fgetc();  
  215.     return ((unsigned long)gw1<<16) | 
  216.        ((unsigned long)gw2<<8) | (unsigned long)gw3;
  217. }
  218.  
  219. unsigned long dvi_fu4(void)
  220. {
  221.     int gw1, gw2, gw3, gw4;
  222.  
  223.     gw1 = dvi_fgetc();
  224.     gw2 = dvi_fgetc();
  225.     gw3 = dvi_fgetc();
  226.     gw4 = dvi_fgetc();
  227.     return ((unsigned long)gw1<<24) |
  228.        ((unsigned long)gw2<<16) |
  229.        ((unsigned long)gw3<<8) | (unsigned long)gw4;
  230. }
  231.  
  232. int dvi_fs2(void)
  233. {
  234.     int gw1, gw2;
  235.  
  236.     gw1 = dvi_fgetc();
  237.     gw2 = dvi_fgetc();
  238.     return( (int)( (((int)(signed char)gw1)<<8) | (unsigned)gw2 ) );
  239. }
  240.  
  241. long dvi_fs3(void)
  242. {
  243.     int gw1, gw2, gw3;
  244.  
  245.     gw1 = dvi_fgetc();
  246.     gw2 = dvi_fgetc();
  247.     gw3 = dvi_fgetc();
  248.     return( (long)( (((long)(signed char)gw1)<<16) | 
  249.        ((unsigned)gw2<<8) | (unsigned)gw3 ) );
  250. }
  251.  
  252. long dvi_fs4(void)
  253. {
  254.     int gw1, gw2, gw3, gw4;
  255.  
  256.     gw1 = dvi_fgetc();
  257.     gw2 = dvi_fgetc();
  258.     gw3 = dvi_fgetc();
  259.     gw4 = dvi_fgetc();
  260.     return( (long)( (((long)(signed char)gw1)<<24) | 
  261.        ((unsigned long)gw2<<16) | 
  262.        ((unsigned)gw3<<8) | (unsigned)gw4 ) );
  263. }
  264.  
  265. static double dvi_fconv(long mag, long num, long den, long res)
  266. {
  267.     double rconv = ((double)num/254000.0)*((double)res/(double)den);
  268.     return rconv*((double)mag/1000.0);
  269. }
  270.  
  271. static void dvi_fbad(void)
  272. {
  273.     halt("Error reading dvi-file");
  274. }
  275.  
  276. int dvi_fpost(dvi_info_t *di, long new_mag)
  277. {
  278.     unsigned long dvi_pos, post_loc;
  279.     long c, s, d,  p, a, k, l;
  280.     int ch, i, load_err = 0;
  281.     char fname[MAX_PATH_LEN];
  282.  
  283.     if (di->table!=NULL)
  284.     {
  285.     mem_free(di->table,di->pages*sizeof(long));
  286.     xprint(-1,"}");
  287.     di->table = NULL;
  288.     }
  289.  
  290.     if (di->fonts!=NULL)
  291.     {
  292.     fnt_lfree(di->fonts);
  293.     di->fonts = NULL;
  294.     }
  295.  
  296.     if (dvi_feof()) dvi_fbad();
  297.     dvi_pos = dvi_ftell();
  298.     while(dvi_pos--)
  299.     {
  300.     if (dvi_fseek(dvi_pos)) dvi_fbad();
  301.     if (dvi_fgetc()==DVI_ID_BYTE) break;
  302.     }
  303.     dvi_pos -= 4;
  304.     if (dvi_fseek(dvi_pos)) dvi_fbad();
  305.     post_loc = dvi_fu4();
  306.     if (dvi_fseek(post_loc)) dvi_fbad();
  307.     if (dvi_fgetc()!=POST) halt("Post not found in dvi-file");
  308.  
  309.     if (op.landscape) aspect_ratio = (double)op.hres/(double)op.vres;
  310.     else aspect_ratio = (double)op.vres/(double)op.hres;
  311.  
  312.     di->last    = dvi_fu4();        /* Position der letzten Seite */
  313.     di->num     = dvi_fu4();        /* Zaehler fuer Einheitslaenge */
  314.     di->den     = dvi_fu4();        /* Nenner fuer Einheitslaenge */
  315.     di->orig    = dvi_fu4();        /* Magnification im DVI-File */
  316.     di->l       = dvi_fu4();        /* Hoehe der hoechsten Seite */
  317.     di->u       = dvi_fu4();        /* Breite der breitesten Seiten */
  318.     di->stack   = dvi_fu2();        /* Maximale benoetigte Stacktiefe */
  319.     di->pages   = dvi_fu2();        /* Anzahl Seiten im DVI-File */
  320.     if (op.tracemem) xprint(0,"{PageTable:%ld",(long)di->pages*sizeof(long));
  321.     di->table   = (long*)mem_alloc(di->pages*sizeof(long),"Page-Table");
  322.     di->mag     = new_mag ? new_mag : di->orig;
  323.     di->hconv   = dvi_fconv(di->mag,di->num,di->den,op.hres);
  324.     di->vconv   = dvi_fconv(di->mag,di->num,di->den,op.vres);
  325.     di->width   = (int)round((double)(di->u) * di->hconv) + 1;
  326.     di->height  = (int)round((double)(di->l) * di->vconv) + 1;
  327.     di->fonts   = NULL;
  328.  
  329.     xprint(0,"[%d Pages]",di->pages);
  330.  
  331.     while((ch=dvi_fgetc())!=POST_POST)
  332.     {
  333.     fmt_stop();
  334.     switch(ch)
  335.     {
  336.         case FNT_DEF1:  k = dvi_fgetc(); break;
  337.         case FNT_DEF1+1: k = dvi_fs2();  break;
  338.         case FNT_DEF1+2: k = dvi_fs3();  break;
  339.         case FNT_DEF1+3: k = dvi_fs4();  break;
  340.         case NOP: continue;
  341.         default: dvi_fbad();
  342.     }
  343.     c = dvi_fu4();
  344.     s = dvi_fu4();
  345.     d = dvi_fu4();
  346.     a = dvi_fgetc();
  347.     l = dvi_fgetc();
  348.     if (a+l>=MAX_PATH_LEN) halt("Font name too long");
  349.     for (i=0; i<a+l; i++) fname[i] = dvi_fgetc();
  350.     fname[(int)(a+l)] = '\0';
  351.     if (!fnt_define(&di->fonts,k,c,s,d,fname)) load_err = 1;
  352.     }
  353.  
  354.     (void)dvi_fu4();
  355.     (void)dvi_fgetc();
  356.  
  357.     p = di->last;
  358.     for(i = di->pages; i; i--)
  359.     {
  360.     fmt_stop();
  361.     di->table[i-1] = p;
  362.     if (dvi_fseek(p)) dvi_fbad();
  363.     if (dvi_fgetc()!=BOP) dvi_fbad();
  364.     (void)dvi_fu4();    (void)dvi_fu4();
  365.     (void)dvi_fu4();    (void)dvi_fu4();
  366.     (void)dvi_fu4();    (void)dvi_fu4();
  367.     (void)dvi_fu4();    (void)dvi_fu4();
  368.     (void)dvi_fu4();    (void)dvi_fu4();
  369.     p = dvi_fu4();
  370.     }
  371.     return load_err;
  372. }
  373.  
  374.