[comp.binaries.ibm.pc] Speed Up Printing AUTOCAD Files To PostScript Printers, C source

cramer@pyramid.com (Clayton Cramer) (09/18/88)

I wrote this program a while back.  AutoCad plot files produced for
PostScript printers are quite inefficient, so I wrote a quick filter to
speed things up.  The resulting plot files are 22% smaller and 22%
faster to print.  If you are printing directly to a PostScript printer
from a PC, it might not save you anything to print the plot file to
disk then filter it, but if you are sharing a PostScript printer over a
network, or printing AutoCad plot files from a UNIX system (as we are)
you might find some useful way to use this program.

I offered it to AutoDesk, as an example of how to improve their
PostScript driver, suggesting that they pay me what it was worth to
them (I suggested something around $100).  I guess they decided it
wasn't worth a hundred bucks to save their customers time, because they
never pursued it.

There are two files, an include file called "stdmacro.h", and a C file
called "autocad.c".

-----cut here stdmacro.h--------------------------------------------------
#define _CountOf_(A) ((sizeof (A))/(sizeof (A[0])))
#define _InRange_(Low, Value, High) ((((int)Low) <= ((int)Value)) && (((int)Val
ue) < ((int)High)))
#define _RangeCheck_(Low, Value, High) ((((int)Low) <= ((int)Value)) && (((int)
Value) < ((int)High)))
#define FALSE 0
#define TRUE 1
typedef char boolean;
#define _Max_(A,B) (((A) > (B)) ? (A) : (B))
-----cut here--------------------------------------------------

Here is the autocad.c file.
-----cut here--------------------------------------------------
#include <stdio.h>
#include "stdmacro.h"

main (Argc, Argv)

int         Argc;
char        *Argv[];

    {
    FILE*   CadFile;
    int     I;

    for (I = 1; I < Argc; I++)
        {
        if (NULL != (CadFile = fopen(Argv[I], "r")))
            {
            ProcessFile(CadFile);
            fclose(CadFile);
            }
        }
    }

ProcessFile (FilePtr)

FILE*       FilePtr;

    {
    char    Buffer1[256], Buffer2[256];
    boolean XMatch, YMatch;
    int     StartX, NextX, StartY, NextY;

    while (!feof(FilePtr))
        {
        fgets(Buffer1, sizeof(Buffer1)-1, FilePtr);
        if (!feof(FilePtr))
            {
            if (0 == strncmp (Buffer1, "/n", 2))
                {
                fputs(Buffer1, stdout);
                printf("/p {/Y exch def /X exch def X Y m X Y l} def\n");
                printf("/x {/NextY exch def /StartY exch def /X exch def\n");
                printf("    X StartY moveto X NextY lineto} def\n");
                printf("/y {/Y exch def /NextX exch def /StartX exch def\n");
                printf("    StartX Y moveto NextX Y lineto} def\n");
                }
            else if (Buffer1[strlen(Buffer1)-2] == 'm')
                {
                fgets(Buffer2, sizeof(Buffer2)-1, FilePtr);
                if (!feof(FilePtr))
                    {
                    if(Buffer2[strlen(Buffer2)-2] == 'l')
                        {
                        XMatch = YMatch = FALSE;
                        sscanf(Buffer1, "%d %d", &StartX, &StartY);
                        sscanf(Buffer2, "%d %d", &NextX, &NextY);
                        if (StartX == NextX)
                            XMatch = TRUE;
                        if (StartY == NextY)
                            YMatch = TRUE;
                        if (XMatch && YMatch)
                            printf("%d %d p\n", StartX, StartY);
                        else if (XMatch)
                            printf("%d %d %d x\n", StartX, StartY, NextY);
                        else if (YMatch)
                            printf("%d %d %d y\n", StartX, NextX, StartY);
                        else
                            printf("%s%s", Buffer1, Buffer2);
                        }
                    else
                        printf("%s%s", Buffer1, Buffer2);
                    }
                else
                    printf("%s", Buffer1);
                }
            else
                printf("%s", Buffer1);
            }
        }
    }
-----cut here--------------------------------------------------