[comp.windows.x] Tgif-1.6

william@oahu.cs.ucla.edu (William Cheng) (06/06/90)

I've just put tgif-1.6 in the `contrib' directory of `expo.lcs.ucla.edu'
and the `pub' directory of `rye.cs.ucla.edu'.  Here's a short list of
added features/bug fixes.

1) Fix bugs reported by Sebastian Rahtz regarding the position of the
   PostScript bounding box and %!.
2) Add XDefault "Tgif*PrintCommand" to override lpr.
3) Add -DPSFILE_MOD in Imakefile to chmod the .ps file.
4) Update prtgif to use pipes instead of files.

Following is a patch file to bring tgif from release 1.5 to 1.6.
-------------------------------> cut here <-----------------------------------
*** file.c.orig	Tue Jun  5 12:00:47 1990
--- file.c	Tue Jun  5 12:01:04 1990
***************
*** 6,10 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/file.c,v 1.12 90/05/28 07:48:15 william Exp $";
  #endif
  
--- 6,10 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/file.c,v 1.13 90/06/05 10:30:42 william Exp $";
  #endif
  
***************
*** 68,72 ****
     char	* FileName;
  {
!    char s[256];
     FILE	* fp;
  
--- 68,72 ----
     char	* FileName;
  {
!    char s[MAXSTRING];
     FILE	* fp;
  
***************
*** 384,389 ****
     struct ObjRec	* * ObjPtr;
  {
!    char			inbuf[256], obj_name[10], tmp_str[256], * s, * s1;
!    char			* line = NULL, * c_ptr;
     int			len, id, old_len, cur_size, done = FALSE;
     int			allocated = FALSE;
--- 384,389 ----
     struct ObjRec	* * ObjPtr;
  {
!    char			inbuf[MAXSTRING+1], obj_name[10], tmp_str[MAXSTRING+1];
!    char			* line = NULL, * c_ptr, * s, * s1;
     int			len, id, old_len, cur_size, done = FALSE;
     int			allocated = FALSE;
***************
*** 392,396 ****
     struct AttrRec       * top_attr = NULL, * bot_attr = NULL, * attr_ptr;
  
!    while (fgets (inbuf, 256, FP) != NULL)
     {
        if (inbuf[0] == ']') return (FALSE);
--- 392,396 ----
     struct AttrRec       * top_attr = NULL, * bot_attr = NULL, * attr_ptr;
  
!    while (fgets (inbuf, MAXSTRING, FP) != NULL)
     {
        if (inbuf[0] == ']') return (FALSE);
***************
*** 398,409 ****
        len = strlen(inbuf);
        if (inbuf[len-1] != '\r' && inbuf[len-1] != '\n')
!       {  /* line longer than 256 characters */
!          /* inbuf[255] == '\0' and len == 255 now */
!          cur_size = 510;
           allocated = TRUE;
           line = (char *) calloc (cur_size, sizeof(char));
           strcpy (line, inbuf);
!          c_ptr = &(line[255]);
!          while (fgets (inbuf, 256, FP) != NULL && !done)
           {
              len = strlen(inbuf);
--- 398,409 ----
        len = strlen(inbuf);
        if (inbuf[len-1] != '\r' && inbuf[len-1] != '\n')
!       {  /* line longer than MAXSTRING characters */
!          /* inbuf[MAXSTRING-1] == '\0' and len == MAXSTRING-1 now */
!          cur_size = 2*(MAXSTRING-1);
           allocated = TRUE;
           line = (char *) calloc (cur_size, sizeof(char));
           strcpy (line, inbuf);
!          c_ptr = &(line[MAXSTRING-1]);
!          while (fgets (inbuf, MAXSTRING, FP) != NULL && !done)
           {
              len = strlen(inbuf);
***************
*** 416,423 ****
              else
              {
!                cur_size += 255;
                 line = (char *) realloc (line, cur_size);
                 strcpy (c_ptr, inbuf);
!                c_ptr += 255;
              }
           }
--- 416,423 ----
              else
              {
!                cur_size += MAXSTRING-1;
                 line = (char *) realloc (line, cur_size);
                 strcpy (c_ptr, inbuf);
!                c_ptr += MAXSTRING-1;
              }
           }
***************
*** 530,534 ****
           ReadGroupObj (FP, ObjPtr);
           (*ObjPtr)->type = OBJ_ICON;
!          if (fgets (line, 256, FP) == NULL)
           {
              if (allocated) cfree (line);
--- 530,534 ----
           ReadGroupObj (FP, ObjPtr);
           (*ObjPtr)->type = OBJ_ICON;
!          if (fgets (line, MAXSTRING, FP) == NULL)
           {
              if (allocated) cfree (line);
***************
*** 833,837 ****
     ury1 = -1.0*lty*real_ps_dots_per_inch/(PIX_PER_INCH);
  
!    fprintf (fp,"%%%%BoundingBox: %.3f %.3f %.3f %.3f\n\n",llx1,lly1,urx1,ury1);
  }
  
--- 833,837 ----
     ury1 = -1.0*lty*real_ps_dots_per_inch/(PIX_PER_INCH);
  
!    fprintf (fp,"%%%%BoundingBox: %.3f %.3f %.3f %.3f\n",llx1,lly1,urx1,ury1);
  }
  
***************
*** 839,845 ****
  {
     register struct ObjRec	* obj_ptr;
!    char				cmd[BUFSIZ], tmp_str[BUFSIZ];
!    char				tmp_file[BUFSIZ], ps_file[BUFSIZ];
!    char				message[BUFSIZ];
     int				i, len;
     FILE				* fp, * fps;
--- 839,845 ----
  {
     register struct ObjRec	* obj_ptr;
!    char				* c_ptr, cmd[MAXSTRING+1], tmp_str[MAXSTRING+1];
!    char				tmp_file[MAXSTRING+1], ps_file[MAXSTRING+1];
!    char				message[MAXSTRING+1];
     int				i, len;
     FILE				* fp, * fps;
***************
*** 859,862 ****
--- 859,864 ----
     }
  
+    fprintf (fp, "%%!\n");
+    DumpBBox (fp);
     sprintf(ps_file, "%s/.psmac", drawPath);
     if ((fps = fopen (ps_file, "r")) == NULL) 
***************
*** 864,877 ****
        sprintf (message, "Can not find %s, print aborted.", ps_file);
        Msg (message);
!       unlink(tmp_file);
        return;
     }
!    /*
!     * Copy the header file.
!     */
!    while (fgets(tmp_str, 256, fps) != NULL)
! 	fputs(tmp_str, fp);
  
-    DumpBBox (fp);
     fprintf (fp, "gsave\n\n");
     switch (pageStyle)
--- 866,876 ----
        sprintf (message, "Can not find %s, print aborted.", ps_file);
        Msg (message);
!       fclose (fp);
!       unlink (tmp_file);
        return;
     }
!    while (fgets (tmp_str, MAXSTRING, fps) != NULL) /* copy the header file */
!       fputs (tmp_str, fp);
  
     fprintf (fp, "gsave\n\n");
     switch (pageStyle)
***************
*** 896,900 ****
     {
        case PRINTER:
!          sprintf (cmd, "lpr %s 2>&1", tmp_file);
           if ((fp = popen (cmd, "r")) == NULL)
           {
--- 895,903 ----
     {
        case PRINTER:
!          if ((c_ptr = XGetDefault (mainDisplay,"Tgif","PrintCommand")) != NULL)
!             sprintf (cmd, "%s %s 2>&1", c_ptr, tmp_file);
!          else
!             sprintf (cmd, "lpr %s 2>&1", tmp_file);
! 
           if ((fp = popen (cmd, "r")) == NULL)
           {
***************
*** 904,908 ****
              return;
           }
!          while (fgets (tmp_str, 256, fp) != NULL)
           {
              Msg (tmp_str);
--- 907,911 ----
              return;
           }
!          while (fgets (tmp_str, MAXSTRING, fp) != NULL)
           {
              Msg (tmp_str);
***************
*** 927,931 ****
           sprintf (cmd, "Printing into '%s'.", ps_file);
           Msg (cmd);
!          sprintf (cmd, "tgif2ps < %s 1> %s 2>&1", tmp_file, ps_file);
           if ((fp = popen (cmd, "r")) == NULL)
           {
--- 930,935 ----
           sprintf (cmd, "Printing into '%s'.", ps_file);
           Msg (cmd);
!          sprintf (cmd, "tgif2ps < %s 1> %s 2>&1; chmod %s %s", tmp_file,
!                ps_file, PSFILE_MOD, ps_file);
           if ((fp = popen (cmd, "r")) == NULL)
           {
***************
*** 935,939 ****
              return;
           }
!          while (fgets(tmp_str, 256, fp) != NULL)
           {
              Msg (tmp_str);
--- 939,943 ----
              return;
           }
!          while (fgets(tmp_str, MAXSTRING, fp) != NULL)
           {
              Msg (tmp_str);
*** mainloop.c.orig	Tue Jun  5 12:02:05 1990
--- mainloop.c	Tue Jun  5 12:02:19 1990
***************
*** 6,10 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/mainloop.c,v 1.2 90/05/07 15:15:33 william Exp $";
  #endif
  
--- 6,10 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/mainloop.c,v 1.3 90/05/30 16:59:58 william Exp $";
  #endif
  
*** prtgif.c.orig	Tue Jun  5 12:03:10 1990
--- prtgif.c	Tue Jun  5 12:03:21 1990
***************
*** 6,10 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/prtgif.c,v 1.7 90/05/25 20:33:59 william Exp $";
  #endif
  
--- 6,10 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/prtgif.c,v 1.9 90/06/05 10:09:52 william Exp $";
  #endif
  
***************
*** 646,671 ****
  {
     register struct ObjRec	* obj_ptr;
!    char				cmd[MAXSTRING+1];
!    char				tmp_file1[30], tmp_file2[30];
!    FILE				* fp;
  
     if (botObj == NULL) { printf ("No object to print."); return; }
  
!    sprintf (tmp_file1, "/tmp/Tgif1XXXXXX");
!    sprintf (tmp_file2, "/tmp/Tgif2XXXXXX");
!    mktemp (tmp_file1);
!    mktemp (tmp_file2);
!    sprintf (cmd, "rm -f %s %s", tmp_file1, tmp_file2);
!    system (cmd);
  
!    if ((fp = fopen (tmp_file1, "w")) == NULL)
     {
!       printf ("Can not create $s, print aborted.", tmp_file1);
        return;
     }
  
!    printf ("Writing to %s ...\n", tmp_file2);
  
     DumpBBox (fp);
     fprintf (fp, "gsave\n\n");
     switch (pageStyle)
--- 646,680 ----
  {
     register struct ObjRec	* obj_ptr;
!    char				cmd[MAXSTRING+1], tmp_str[MAXSTRING+1];
!    char				tmp_file[MAXSTRING+1], ps_file[MAXSTRING+1];
!    FILE				* fp, * fps;
  
     if (botObj == NULL) { printf ("No object to print."); return; }
  
!    strcpy (tmp_file, "/tmp/TgifXXXXXX");
!    mktemp (tmp_file);
!    unlink (tmp_file);
  
!    if ((fp = fopen (tmp_file, "w")) == NULL)
     {
!       printf ("Can not create $s, print aborted.", tmp_file);
        return;
     }
  
!    printf ("Writing to %s ...\n", tmp_file);
  
+    fprintf (fp, "%%!\n");
     DumpBBox (fp);
+    sprintf(ps_file, "%s/.psmac", drawPath);
+    if ((fps = fopen (ps_file, "r")) == NULL)
+    {
+       printf ("Can not find %s, print aborted.\n", ps_file);
+       fclose (fp);
+       unlink (tmp_file);
+       return;
+    }
+    while (fgets (tmp_str, 256, fps) != NULL) /* copy the header file */
+       fputs (tmp_str, fp);
+ 
     fprintf (fp, "gsave\n\n");
     switch (pageStyle)
***************
*** 687,701 ****
     fclose (fp);
  
!    sprintf (cmd, "cat %s/.psmac %s > %s", drawPath, tmp_file1, tmp_file2);
!    system (cmd);
!    chmod (tmp_file1, 0777);
!    chmod (tmp_file2, 0777);
!    sprintf (cmd, "lpr %s", tmp_file2);
!    system (cmd);
  
!    printf ("%s printed.\n\n", tmp_file2);
  
!    sprintf (cmd, "rm -f %s %s", tmp_file1, tmp_file2);
!    system (cmd);
  }
  
--- 696,712 ----
     fclose (fp);
  
!    sprintf (cmd, "lpr %s 2>&1", tmp_file);
!    if ((fp = popen (cmd, "r")) == NULL)
!    {
!       printf ("Can not execute '%s', print aborted.\n", cmd);
!       unlink (tmp_file);
!       return;
!    }
!    while (fgets (tmp_str, 256, fp) != NULL) sleep (5);
  
!    pclose (fp);
!    unlink (tmp_file);
  
!    printf ("%s printed.\n\n", tmp_file);
  }
  
*** setup.c.orig	Tue Jun  5 12:03:44 1990
--- setup.c	Tue Jun  5 12:03:54 1990
***************
*** 6,10 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/setup.c,v 1.6 90/05/22 16:58:19 william Exp $";
  #endif
  
--- 6,10 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/setup.c,v 1.7 90/05/30 16:41:07 william Exp $";
  #endif
  
*** tgif2ps.c.orig	Tue Jun  5 12:04:24 1990
--- tgif2ps.c	Tue Jun  5 12:04:35 1990
***************
*** 6,10 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/tgif2ps.c,v 1.2 90/05/23 13:17:34 william Exp $";
  #endif
  
--- 6,10 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/tgif2ps.c,v 1.4 90/06/05 09:31:14 william Exp $";
  #endif
  
***************
*** 25,28 ****
--- 25,29 ----
        exit (-1);
     }
+    printf ("%%!\n");
  }
  
*** version.c.orig	Tue Jun  5 12:05:20 1990
--- version.c	Tue Jun  5 12:05:29 1990
***************
*** 6,11 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/version.c,v 1.8 90/05/29 09:46:20 william Exp $";
  #endif
  
! char	* version_string = "1.5";
--- 6,11 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/version.c,v 1.9 90/06/05 10:32:28 william Exp $";
  #endif
  
! char	* version_string = "1.6";
*** Imakefile.orig	Tue Jun  5 12:05:44 1990
--- Imakefile	Tue Jun  5 12:05:57 1990
***************
*** 4,15 ****
  /**/# Copyright (C) 1990, William Cheng.
  /**/#
! /**/# @(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/Imakefile,v 1.12 90/05/29 09:45:48 william Exp $
  /**/#
  
! TGIFVERSION	= 1.5
  PROGRAMS	= tgif prtgif tgif2ps frontend11.o
  CDEBUGFLAGS	= -g
  BINDIR		= /u/tangram/bin
! DEFINES		= -DTGIF_PATH=\"/u/tangram/u/william/X11/TGIF\"
  LOCAL_LIBRARIES	= $(XLIB)
  SYS_LIBRARIES	= -lm
--- 4,16 ----
  /**/# Copyright (C) 1990, William Cheng.
  /**/#
! /**/# @(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/Imakefile,v 1.13 90/06/05 10:32:37 william Exp $
  /**/#
  
! TGIFVERSION	= 1.6
  PROGRAMS	= tgif prtgif tgif2ps frontend11.o
  CDEBUGFLAGS	= -g
  BINDIR		= /u/tangram/bin
! DEFINES		= -DTGIF_PATH=\"/u/tangram/u/william/X11/TGIF\" \
! 		  -DPSFILE_MOD=\"664\"
  LOCAL_LIBRARIES	= $(XLIB)
  SYS_LIBRARIES	= -lm
*** .psmac.orig	Tue Jun  5 12:07:04 1990
--- .psmac	Tue Jun  5 12:07:15 1990
***************
*** 1,3 ****
- %!
  
  /ellipsedict 6 dict def
--- 1,2 ----
*** tgif.man.orig	Tue Jun  5 12:20:48 1990
--- tgif.man	Tue Jun  5 12:20:57 1990
***************
*** 1,4 ****
! .\"@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/tgif.man,v 1.5 90/05/25 14:29:20 william Exp $
! .TH TGIF 1 "Version 1.3" "Tgif"
  .SH NAME
  \fItgif\fR \- Xlib based 2-D drawing facility under X11.  Also supports
--- 1,4 ----
! .\"@(#)$Header: /n/kona/u/tangram/u/william/X11/TGIF/RCS/tgif.man,v 1.6 90/06/05 12:19:24 william Exp $
! .TH TGIF 1 "Version 1.6" "Tgif"
  .SH NAME
  \fItgif\fR \- Xlib based 2-D drawing facility under X11.  Also supports
***************
*** 366,369 ****
--- 366,373 ----
  This specified the default color index if certain color can not be found.
  Default is 0.
+ .TP
+ .I Tgif*PrintCommand: COMMAND
+ This specified the print command used for printing the PostScript file.
+ Default is lpr (without any quotes).
  .SH ENVIRONMENT
  .TP
-------------------------------> cut here <-----------------------------------
--

-- Bill Cheng // UCLA Computer Science Department // (213) 206-7135
   3277 Boelter Hall // Los Angeles, California 90024 // USA
   william@CS.UCLA.EDU      ...!{uunet|ucbvax}!cs.ucla.edu!william