home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / converters / dvips_1 / !dvips_src_c_dospecial < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-04  |  17.8 KB  |  659 lines

  1. /*
  2.  *   This routine handles special commands;
  3.  *   predospecial() is for the prescan, dospecial() for the real thing.
  4.  */
  5. #include "dvips.h" /* The copyright notice in that file is included too! */
  6.  
  7. /* extern int atoi(); */
  8. extern void fil2ps();
  9. extern FILE *search();
  10. extern int system();
  11. /*
  12.  *   These are the external routines called:
  13.  */
  14. /**/
  15. #ifdef TPIC
  16. /*
  17.  * Fri Mar  9 1990  jourdan@minos.inria.fr (MJ)
  18.  * Upgraded to accommodate tpic release 2.0 extended output language.
  19.  * Should prove upward compatible! 
  20.  * Mod: 4/6/94 - ll 106-116
  21.  */
  22. extern void setPenSize();
  23. extern void flushPath();
  24. extern void flushDashed();
  25. extern void flushDashed();
  26. extern void addPath();
  27. extern void arc();
  28. extern void flushSpline();
  29. extern void shadeLast();
  30. extern void whitenLast();
  31. extern void blackenLast();
  32. extern void SetShade() ;
  33. #endif
  34. extern shalfword dvibyte() ;
  35. extern int add_header() ;
  36. extern void hvpos() ;
  37. extern void figcopyfile() ;
  38. extern void nlcmdout() ;
  39. extern void cmdout() ;
  40. extern void numout() ;
  41. extern void scout() ;
  42. extern void stringend() ;
  43. extern void error() ;
  44. extern void psflush() ;
  45. extern void emspecial() ;
  46. /* IBM: color - begin */
  47. extern void pushcolor() ;
  48. extern void popcolor() ;
  49. extern void resetcolorstack() ;
  50. extern void background() ;
  51. /* IBM: color - end */
  52. extern char errbuf[] ;
  53. extern shalfword linepos;
  54. extern Boolean usesspecial ;
  55. extern Boolean usescolor ;   /* IBM: color */
  56. extern int landscape ;
  57. extern char *paperfmt ;
  58. extern char *nextstring;
  59. extern char *maxstring;
  60. extern char *oname;
  61. extern FILE *bitfile;
  62. extern int quiet;
  63. extern fontdesctype *curfnt ;
  64. extern int actualdpi ;
  65. extern int vactualdpi ;
  66. extern integer hh, vv;
  67. extern int lastfont ;
  68. extern real conv ;
  69. extern real vconv ;
  70. extern integer hpapersize, vpapersize ;
  71. extern Boolean pprescan ;
  72. /* extern char *figpath ;*/
  73. extern int prettycolumn ;
  74. extern Boolean disablecomments ;
  75.  
  76. #ifdef DEBUG
  77. extern integer debug_flag;
  78. #endif
  79. extern void scanfontcomments() ;
  80. extern void handlepapersize() ;
  81.  
  82. static int specialerrors = 20 ;
  83.  
  84. struct bangspecial {
  85.    struct bangspecial *next ;
  86.    char actualstuff[1] ; /* more space will actually be allocated */
  87. } *bangspecials = NULL ;
  88.  
  89. void specerror(s)
  90. char *s ;
  91. {
  92.    if (specialerrors > 0) {
  93.       error(s) ;
  94.       specialerrors-- ;
  95.    } else if (specialerrors == 0) {
  96.       error("more errors in special, being ignored . . .") ;
  97.       specialerrors-- ;
  98.    }
  99. }
  100.  
  101. static void trytobreakout(p)
  102. register char *p ;
  103. {
  104.    register int i ;
  105.    register int instring = 0 ;
  106.    int lastc = 0 ;
  107.  
  108.    i = 0 ;
  109.  
  110. /* cmdout() knows something about specials.  Leaving out this call to
  111.  * cmdout() sometimes results in the wrong order for specials and other
  112.  * stuff (i.e., not the same order the user wants them to be in).
  113.  */
  114.    cmdout("");  /* horrible hack DAR 6/94 */
  115.    (void)putc('\n', bitfile) ;
  116.    while (*p) {
  117.       if (i > 65 && *p == ' ' && instring == 0) {
  118.          (void)putc('\n', bitfile) ;
  119.          i = 0 ;
  120.       } else {
  121.          (void)putc(*p, bitfile) ;
  122.          i++ ;
  123.       }
  124.       if (*p == '(' && lastc != '\\')
  125.          instring = 1 ;
  126.       else if (*p == ')' && lastc != '\\')
  127.          instring = 0 ;
  128.       lastc = *p ;
  129.       p++ ;
  130.    }
  131.    (void)putc('\n', bitfile) ;
  132. }
  133.  
  134. static void dobs(q)
  135. register struct bangspecial *q ;
  136. {
  137.    if (q) {
  138.       dobs(q->next) ;
  139.       trytobreakout(q->actualstuff) ;
  140.    }
  141. }
  142.  
  143. void
  144. outbangspecials() {
  145.    if (bangspecials) {
  146.       cmdout("TeXDict") ;
  147.       cmdout("begin") ;
  148.       cmdout("@defspecial\n") ;
  149.       dobs(bangspecials) ;
  150.       cmdout("\n@fedspecial") ;
  151.       cmdout("end") ;
  152.    }
  153. }
  154.  
  155. /* We recommend that new specials be handled by the following general
  156.  * (and extensible) scheme, in which the user specifies one or more
  157.  * `key=value' pairs separated by spaces.
  158.  * The known keys are given in KeyTab; they take values
  159.  * of one of the following types:
  160.  *
  161.  * None: no value, just a keyword (in which case the = sign is omitted)
  162.  * String: the value should be "<string without double-quotes"
  163.  *                          or '<string without single-quotes'
  164.  * Integer: the value should be a decimal integer (%d format)
  165.  * Number: the value should be a decimal integer or real (%f format)
  166.  * Dimension: like Number, but will be multiplied by the scaledsize
  167.  *       of the current font and converted to default PostScript units
  168.  * (Actually, strings are allowed in all cases; the delimiting quotes
  169.  *  are simply stripped off if present.)
  170.  *
  171.  */
  172.  
  173. typedef enum {None, String, Integer, Number, Dimension} ValTyp;
  174. typedef struct {
  175.    char    *Entry;
  176.    ValTyp  Type;
  177. } KeyDesc;
  178.  
  179. #define NKEYS    (sizeof(KeyTab)/sizeof(KeyTab[0]))
  180.  
  181. KeyDesc KeyTab[] = {{"psfile",  String}, /* j==0 in the routine below */
  182.                     {"ifffile", String}, /* j==1 */
  183.                     {"tekfile", String}, /* j==2 */
  184.                     {"hsize",   Number},
  185.                     {"vsize",   Number},
  186.                     {"hoffset", Number},
  187.                     {"voffset", Number},
  188.                     {"hscale",  Number},
  189.                     {"vscale",  Number},
  190.                     {"angle",   Number},
  191.                     {"llx", Number},
  192.                     {"lly", Number},
  193.                     {"urx", Number},
  194.                     {"ury", Number},
  195.                     {"rwi", Number},
  196.                     {"rhi", Number},
  197.                     {"clip", None}};
  198.  
  199. #ifdef VMS
  200. #ifndef __GNUC__    /* GNUC tolower is too simple */
  201. #define Tolower tolower
  202. #endif
  203. #else
  204. #ifdef VMCMS    /* IBM: VM/CMS */
  205. #define Tolower __tolower
  206. #else
  207. #ifdef MVSXA    /* IBM: MVS/XA */
  208. #define Tolower __tolower
  209. #else
  210. /*
  211.  * compare strings, ignore case
  212.  */
  213. char Tolower(c)
  214. register char c ;
  215. {
  216.    if ('A' <= c && c <= 'Z')
  217.       return(c+32) ;
  218.    else
  219.       return(c) ;
  220. }
  221. #endif
  222. #endif  /* IBM: VM/CMS */
  223. #endif
  224. int IsSame(a, b)
  225. char *a, *b;
  226. {
  227.    for( ; *a != '\0'; ) {
  228.       if( Tolower(*a) != Tolower(*b) ) 
  229.          return( 0 );
  230.       a++ ;
  231.       b++ ;
  232.    }
  233.    return( *b == '\0' );
  234. }
  235.  
  236. char *KeyStr, *ValStr ; /* Key and String values found */
  237. long ValInt ; /* Integer value found */
  238. float ValNum ; /* Number or Dimension value found */
  239.  
  240. char  *GetKeyVal(str,tno) /* returns NULL if none found, else next scan point */
  241.    char *str ; /* starting point for scan */
  242.    int  *tno ; /* table entry number of keyword, or -1 if keyword not found */
  243. {
  244.    register char *s ;
  245.    register int i ;
  246.    register char t ;
  247.  
  248.    for (s=str; *s <= ' ' && *s; s++) ; /* skip over blanks */
  249.    if (*s == '\0')
  250.       return (NULL) ;
  251.    KeyStr = s ;
  252.    while (*s>' ' && *s!='=') s++ ;
  253.    if (0 != (t = *s))
  254.       *s++ = 0 ;
  255.  
  256.    for(i=0; i<NKEYS; i++)
  257.       if( IsSame(KeyStr, KeyTab[i].Entry) )
  258.          goto found ;
  259.    *tno = -1;
  260.    return (s) ;
  261.  
  262. found: *tno = i ;
  263.    if (KeyTab[i].Type == None)
  264.       return (s) ;
  265.  
  266.    if (t && t <= ' ') {
  267.       for (; *s <= ' ' && *s; s++) ; /* now look for the value part */
  268.       if ((t = *s)=='=')
  269.          s++ ;
  270.    }
  271.    ValStr = "" ;
  272.    if ( t == '=' ) {
  273.       while (*s <= ' ' && *s)
  274.          s++ ;
  275.       if (*s=='\'' || *s=='\"')
  276.          t = *s++ ;               /* get string delimiter */
  277.       else t = ' ' ;
  278.       ValStr = s ;
  279.       while (*s!=t && *s)
  280.          s++ ;
  281.       if (*s)
  282.          *s++ = 0 ;
  283.    }
  284.    switch (KeyTab[i].Type) {
  285.  case Integer:
  286.       if(sscanf(ValStr,"%ld",&ValInt)!=1) {
  287.           sprintf(errbuf,"Non-integer value (%s) given for keyword %s",
  288.               ValStr, KeyStr) ;
  289.           specerror(errbuf) ;
  290.           ValInt = 0 ;
  291.       }
  292.       break ;
  293.  case Number:
  294.  case Dimension:
  295.       if(sscanf(ValStr,"%f",&ValNum)!=1) {  
  296.           sprintf(errbuf,"Non-numeric value (%s) given for keyword %s",
  297.               ValStr, KeyStr) ;
  298.           specerror(errbuf) ;
  299.           ValNum = 0.0 ;
  300.       }
  301.       if (KeyTab[i].Type==Dimension) {
  302.          if (curfnt==NULL)
  303.             error("! No font selected") ;
  304.          ValNum = ValNum * ((double)curfnt->scaledsize) * conv * 72 / DPI ;
  305.       }
  306.       break ;
  307.  default: break ;
  308.    }
  309.    return (s) ;
  310. }
  311.  
  312. /*
  313.  *   Now our routines.  We get the number of bytes specified and place them
  314.  *   into the string buffer, and then parse it. Numerous conventions are
  315.  *   supported here for historical reasons.
  316.  */
  317.  
  318. void predospecial(numbytes, scanning)
  319. integer numbytes ;
  320. Boolean scanning ;
  321. {
  322.    register char *p = nextstring ;
  323.    register int i = 0 ;
  324.    int j ;
  325.  
  326.    if (nextstring + numbytes > maxstring)
  327.       error("! out of string space in predospecial") ;
  328.    for (i=numbytes; i>0; i--)
  329. #ifdef VMCMS /* IBM: VM/CMS */
  330.       *p++ = ascii2ebcdic[(char)dvibyte()] ;
  331. #else
  332. #ifdef MVSXA /* IBM: MVS/XA */
  333.       *p++ = ascii2ebcdic[(char)dvibyte()] ;
  334. #else
  335.       *p++ = (char)dvibyte() ;
  336. #endif /* IBM: VM/CMS */
  337. #endif
  338.    if (pprescan)
  339.       return ;
  340.    while (p[-1] <= ' ' && p > nextstring)
  341.       p-- ; /* trim trailing blanks */
  342.    if (p==nextstring) return ; /* all blank is no-op */
  343.    *p = 0 ;
  344.    p = nextstring ;
  345.    while (*p <= ' ')
  346.       p++ ;
  347. #ifdef DEBUG
  348.    if (dd(D_SPECIAL))
  349.       (void)fprintf(stderr, "Preprocessing special: %s\n", p) ;
  350. #endif
  351.  
  352. /*
  353.  *   We use strncmp() here to also pass things like landscape()
  354.  *   or landscape: or such.
  355.  */
  356.  
  357.    if (strncmp(p, "landscape", 9)==0) {
  358.       if (hpapersize || vpapersize)
  359.          error(
  360.              "both landscape and papersize specified:  ignoring landscape") ;
  361.       else
  362.          landscape = 1 ;
  363.       return ;
  364.    } else if (strncmp(p, "papersize", 9)==0) {
  365.       p += 9 ;
  366.       while (*p == '=' || *p == ' ')
  367.          p++ ;
  368.       if (hpapersize == 0 || vpapersize == 0) {
  369.          if (landscape) {
  370.             error(
  371.              "both landscape and papersize specified:  ignoring landscape") ;
  372.             landscape = 0 ;
  373.          }
  374.          handlepapersize(p, &hpapersize, &vpapersize) ;
  375.       }
  376.       return ;
  377.    }
  378.    if (strncmp(p, "xtex:", 5)==0) return ;
  379.    usesspecial = 1 ;  /* now the special prolog will be sent */
  380.    if (strncmp(p, "header", 6)==0) {
  381.       char *q ;
  382.       p += 6 ;
  383.       while ((*p <= ' ' || *p == '=' || *p == '(') && *p != 0)
  384.          p++ ;
  385.       q = p ;  /* we will remove enclosing parentheses */
  386.       p = p + strlen(p) - 1 ;
  387.       while ((*p <= ' ' || *p == ')') && p >= q)
  388.          p-- ;
  389.       p[1] = 0 ;
  390.       if (p >= q)
  391.          (void)add_header(q) ;
  392.    }
  393. /* IBM: color - added section here for color header and color history */
  394.    if (strncmp(p, "background", 10) == 0) {
  395.       usescolor = 1 ;
  396.       p +=11 ;
  397.       while ( *p <= ' ' ) p++ ;
  398.       background(p) ;
  399.    }
  400.    if (strncmp(p, "color", 5) == 0) {
  401.       usescolor = 1 ;
  402.       p += 6 ;
  403.       while ( *p <= ' ' ) p++ ;
  404.       if (strncmp(p, "push", 4) == 0 ) {
  405.          p += 5 ;
  406.          while ( *p <= ' ' ) p++ ;
  407.          pushcolor(p, 0) ;
  408.       } else if (strncmp(p, "pop", 3) == 0 ) {
  409.          popcolor(0) ;
  410.       } else {
  411.          resetcolorstack(p,0) ;
  412.       }
  413.    }   /* IBM: color - end changes */
  414.    else if (*p == '!') {
  415.       register struct bangspecial *q ;
  416.       p++ ;
  417.       q = (struct bangspecial *)mymalloc((integer)
  418.                          (sizeof(struct bangspecial) + strlen(p))) ;
  419.       (void)strcpy(q->actualstuff, p) ;
  420.       q->next = bangspecials ;
  421.       bangspecials = q ;
  422.    } else if (scanning && *p != '"' &&
  423.           (p=GetKeyVal(p, &j)) != NULL && j==0)
  424.       scanfontcomments(ValStr) ;
  425. }
  426.  
  427. int maccess(s)
  428. char *s ;
  429. {
  430.    FILE *f = search(figpath, s, "r") ;
  431.    if (f)
  432.       fclose(f) ;
  433.    return (f != 0) ;
  434. }
  435.  
  436. char *tasks[] = { 0, "iff2ps", "tek2ps" } ;
  437.  
  438. static char psfile[511] ; 
  439. void dospecial(numbytes)
  440. integer numbytes ;
  441. {
  442.    register char *p = nextstring ;
  443.    register int i = 0 ;
  444.    int j, systemtype = 0 ;
  445.    register char *q ;
  446.    Boolean psfilewanted = 1 ;
  447.    char *task = 0 ;
  448.    char cmdbuf[111] ; 
  449.  
  450.    if (nextstring + i > maxstring)
  451.       error("! out of string space in dospecial") ;
  452.    for (i=numbytes; i>0; i--)
  453. #ifdef VMCMS /* IBM: VM/CMS */
  454.       *p++ = ascii2ebcdic[(char)dvibyte()] ;
  455. #else
  456. #ifdef MVSXA /* IBM: MVS/XA */
  457.       *p++ = ascii2ebcdic[(char)dvibyte()] ;
  458. #else
  459.       *p++ = (char)dvibyte() ;
  460. #endif  /* IBM: VM/CMS */
  461. #endif
  462.    while (p[-1] <= ' ' && p > nextstring)
  463.       p-- ; /* trim trailing blanks */
  464.    if (p==nextstring) return ; /* all blank is no-op */
  465.    *p = 0 ;
  466.    p = nextstring ;
  467.    while (*p <= ' ')
  468.       p++ ;
  469. #ifdef DEBUG
  470.    if (dd(D_SPECIAL))
  471.       (void)fprintf(stderr, "Processing special: %s\n", p) ;
  472. #endif
  473.  
  474.    if (strncmp(p, "em:", 3)==0) {    /* emTeX specials in emspecial.c */
  475.     emspecial(p);
  476.     return;
  477.    }
  478.  
  479.    if (strncmp(p, "ps:", 3)==0) {
  480.         psflush() ; /* now anything can happen. */
  481.         if (p[3]==':') {
  482.            if (strncmp(p+4, "[begin]", 7) == 0) {
  483.               hvpos() ;
  484.               trytobreakout(&p[11]);
  485.            } else if (strncmp(p+4, "[end]", 5) == 0)
  486.               trytobreakout(&p[9]);
  487.            else trytobreakout(&p[4]);
  488.         } else if (strncmp(p+3, " plotfile ", 10) == 0) {
  489.              char *sfp ;
  490.              hvpos() ;
  491.              p += 13;
  492.            /*
  493.             *  Fixed to allow popen input for plotfile
  494.             *  TJD 10/20/91
  495.             */
  496.            while (*p == ' ') p++;
  497.            if (*p == '"') {
  498.              p++;
  499.              for (sfp = p; *sfp && *sfp != '"'; sfp++) ;
  500.            } else {
  501.              for (sfp = p; *sfp && *sfp != ' '; sfp++) ;
  502.            }
  503.            *sfp = '\0';
  504.            if (*p == '`') 
  505.              figcopyfile(p+1, 1);
  506.            else
  507.              figcopyfile (p, 0);
  508.            /* End TJD changes */
  509.         } else {
  510.            hvpos() ;
  511.            trytobreakout(&p[3]);
  512.            psflush() ;
  513.            hvpos() ;
  514.         }
  515.         return;
  516.    }
  517.    if (strncmp(p, "landscape", 9)==0 || strncmp(p, "header", 6)==0 ||
  518.        strncmp(p, "papersize", 9)==0 || *p=='!')
  519.       return ; /* already handled in prescan */
  520. /* IBM: color - begin changes */
  521.    if ( strncmp(p, "background", 10) == 0 )
  522.       return ; /* already handled in prescan */
  523.    if (strncmp(p, "color", 5) == 0) {
  524.       p += 6 ;
  525.       while ( *p <= ' ' ) p++ ;
  526.       if (strncmp(p, "push", 4) == 0 ) {
  527.          p += 4 ;
  528.          while ( *p <= ' ' ) p++ ;
  529.          pushcolor(p,1);
  530.       } else if (strncmp(p, "pop", 3) == 0 ) {
  531.          popcolor(1) ;
  532.       } else {
  533.          resetcolorstack(p,1) ;
  534.       }
  535.       return ;
  536.    } /* IBM: color - end changes*/
  537. #ifdef TPIC
  538. /* ordered as in tpic 2.0 documentation for ease of cross-referencing */
  539.    if (strncmp(p, "pn ", 3) == 0) {setPenSize(p+2); return;}
  540.    if (strncmp(p, "pa ", 3) == 0) {addPath(p+2); return;}
  541.    if (strcmp(p, "fp") == 0) {flushPath(0); return;}
  542.    if (strcmp(p, "ip") == 0) {flushPath(1); return;} /* tpic 2.0 */
  543.    if (strncmp(p, "da ", 3) == 0) {flushDashed(p+2, 0); return;}
  544.    if (strncmp(p, "dt ", 3) == 0) {flushDashed(p+2, 1); return;}
  545.    if (strcmp(p, "sp") == 0) {flushSpline(p+2); return;} /* tpic 2.0 */
  546.    if (strncmp(p, "sp ", 3) == 0) {flushSpline(p+3); return;} /* tpic 2.0 */
  547.    if (strncmp(p, "ar ", 3) == 0) {arc(p+2, 0); return;} /* tpic 2.0 */
  548.    if (strncmp(p, "ia ", 3) == 0) {arc(p+2, 1); return;} /* tpic 2.0 */
  549.    if (strcmp(p, "sh") == 0) {shadeLast(p+2); return;} /* tpic 2.0 */
  550.    if (strncmp(p, "sh ", 3) == 0) {shadeLast(p+3); return;} /* tpic 2.0 */
  551.    if (strcmp(p, "wh") == 0) {whitenLast(); return;}
  552.    if (strcmp(p, "bk") == 0) {blackenLast(); return;}
  553.    if (strncmp(p, "tx ", 3) == 0) {SetShade(p+3); return;}
  554. #endif
  555.    if (*p == '"') {
  556.       hvpos() ;
  557.       cmdout("@beginspecial") ;
  558.       cmdout("@setspecial") ;
  559.       trytobreakout(p+1) ;
  560.       cmdout("\n@endspecial") ;
  561.       return ;
  562.    }
  563.  
  564. /* At last we get to the key/value conventions */
  565.    psfile[0] = '\0';
  566.    hvpos();
  567.    cmdout("@beginspecial");
  568.  
  569.    while( (p=GetKeyVal(p,&j)) != NULL )
  570.       switch (j) {
  571.  case -1: /* for compatability with old conventions, we allow a file name
  572.            * to be given without the 'psfile=' keyword */
  573.          if (!psfile[0] && maccess(KeyStr)==0) /* yes we can read it */
  574.              (void)strcpy(psfile,KeyStr) ;
  575.          else {
  576.            sprintf(errbuf, "Unknown keyword (%s) in \\special will be ignored",
  577.                               KeyStr) ;
  578.            specerror(errbuf) ;
  579.          }
  580.          break ;
  581.  case 0: case 1: case 2: /* psfile */
  582.          if (psfile[0]) {
  583.            sprintf(errbuf, "More than one \\special %s given; %s ignored", 
  584.                     "psfile",  ValStr) ;
  585.            specerror(errbuf) ;
  586.          }
  587.          else (void)strcpy(psfile,ValStr) ;
  588.          task = tasks[j] ;
  589.          break ;
  590.  default: /* most keywords are output as PostScript procedure calls */
  591.          if (KeyTab[j].Type == Integer)
  592.             numout((integer)ValInt);
  593.          else if (KeyTab[j].Type == String)
  594.             for (q=ValStr; *q; q++)
  595.                scout(*q) ;
  596.          else if (KeyTab[j].Type == None) ;
  597.          else { /* Number or Dimension */
  598.             ValInt = (integer)(ValNum<0? ValNum-0.5 : ValNum+0.5) ;
  599.             if (ValInt-ValNum < 0.001 && ValInt-ValNum > -0.001)
  600.                 numout((integer)ValInt) ;
  601.             else {
  602.                (void)sprintf(cmdbuf, "%f", ValNum) ;
  603.                cmdout(cmdbuf) ;
  604.             }
  605.          }
  606.       (void)sprintf(cmdbuf, "@%s", KeyStr);
  607.       cmdout(cmdbuf) ;
  608.       }
  609.  
  610.    cmdout("@setspecial");
  611.  
  612.    if(psfile[0]) {
  613.       if (task == 0) {
  614.          systemtype = (psfile[0]=='`') ;
  615.          figcopyfile(psfile+systemtype, systemtype);
  616.       } else {
  617.          fil2ps(task, psfile) ;
  618.       }
  619.    } else if (psfilewanted)
  620.       specerror("No \\special psfile was given; figure will be blank") ;
  621.  
  622.    cmdout("@endspecial");
  623. }
  624.  
  625. extern char realnameoffile[] ;
  626. /* extern char *pictpath ; */
  627.  
  628. void fil2ps(task, iname)
  629. char *task, *iname ;
  630. {
  631.    char cmd[400] ;
  632.    FILE *f ;
  633.    if (0 != (f=search(pictpath, iname, "r"))) {
  634.       fclose(f) ;
  635.    } else {
  636.       fprintf(stderr, " couldn't open %s\n", iname) ;
  637.       return ;
  638.    }
  639.    if (!quiet) {
  640.       fprintf(stderr, " [%s", realnameoffile) ;
  641.       fflush(stderr) ;
  642.    }
  643.    if (oname && oname[0] && oname[0] != '-') {
  644.       putc(10, bitfile) ;
  645.       fclose(bitfile) ;
  646.       sprintf(cmd, "%s -f %s %s", task, realnameoffile, oname) ;
  647.       system(cmd) ;
  648.       if ((bitfile=fopen(oname, "a"))==NULL)
  649.          error("! couldn't reopen PostScript file") ;
  650.       linepos = 0 ;
  651.    } else {
  652.       sprintf(cmd, "%s -f %s", task, realnameoffile) ;
  653.       system(cmd) ;
  654.    }
  655.    if (!quiet)
  656.       fprintf(stderr, "]") ;
  657. }
  658.  
  659.