ftp.nice.ch/users/chris/Studium/psopt-0.01.tar.gz#/psopt-0.01/src/output.c

This is output.c in view mode; [Download] [Up]

/* -*-C-*-
 ******************************************************************************
 *
 * File:         output.c
 * RCS:          $Header: /home/chris/Psopt/cvs/psopt/src/output.c,v 1.2 1997/08/25 20:58:06 chris Exp $
 * Description:  
 * Author:       Christian Limpach <chris@nice.ch>
 * Created:      Thu Jun 19 03:28:18 1997
 * Modified:     Mon Aug 25 22:42:52 1997 (Christian Limpach) chris@nice.ch
 * Language:     C
 * Package:      N/A
 * Status:       Experimental (Do Not Distribute)
 *
 * (C) Copyright 1997, Christian Limpach, all rights reserved.
 *            
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *            
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *            
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, a copy can be obtained from this
 * program's author (send electronic mail to chris@nice.ch) or from
 * the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
 * 02139, USA.
 *
 ******************************************************************************
 */

#include "psopt.h"

#define CUTOFF 78
/* 78 */

#ifdef HAVE_VPRINTF
#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (STDC_HEADERS)
#include <stdarg.h>
#define VA_START(args, lastarg) va_start(args, lastarg)
#else
#include <varargs.h>
#define VA_START(args, lastarg) va_start(args)
#endif
#else
#define va_alist a1, a2, a3, a4, a5, a6, a7, a8
#define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
#endif

static int pos;
static int need_space;
static int prepend_space;
static char tmp[CUTOFF+10];

/* VARARGS */
#if defined (HAVE_VPRINTF) && (defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__))
void 
outline (const char *fmt,...)
#else
void 
outline (fmt, va_alist)
     char *fmt;
     va_dcl
#endif
{
#ifdef HAVE_VPRINTF
  va_list args;
#endif
  
  if (pos != 0)
    printf (prepend_space ? " %s\n" : "%s\n", tmp);

#ifdef HAVE_VPRINTF
  VA_START (args, fmt);
  (void) vprintf (fmt, args);
  va_end (args);
#else
  (void) printf (fmt, a1, a2, a3, a4, a5, a6, a7, a8);
#endif
  putchar ('\n');
  
  pos = 0;
  prepend_space = 0;
  tmp[0] = '\0';
}

#define PRINT_TMP  { if (prepend_space) putchar (' '); printf ("%s", tmp); tmp[0] = '\0'; }

static void
handle_linefeeds_and_spaces (len)
     int len;
{
  if (need_space)
    {
      PRINT_TMP;
      prepend_space++;
      pos++;
    }
  if (pos + len > CUTOFF)
    {
      if (!prepend_space)
        PRINT_TMP;
      putchar ('\n');
      prepend_space = 0;
      pos = strlen (tmp);
    }
}

void
outstring (str)
     char *str;
{
  handle_linefeeds_and_spaces (strlen (str));
  strcat (tmp, str);
  pos += strlen (str);
}

/* VARARGS */
#if defined (HAVE_VPRINTF) && (defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__))
void 
outstringf (int len, const char *fmt,...)
#else
void 
outstringf (len, fmt, va_alist)
     int len;
     char *fmt;
     va_dcl
#endif
{
#ifdef HAVE_VPRINTF
  va_list args;
#endif
  char buf[len+10];

  handle_linefeeds_and_spaces (len);

#ifdef HAVE_VPRINTF
  VA_START (args, fmt);
  (void) vsprintf (buf, fmt, args);
  va_end (args);
#else
  (void) sprintf (buf, fmt, a1, a2, a3, a4, a5, a6, a7, a8);
#endif
  strcat (tmp, buf);
  pos += len;
}

void outbinstring (str)
     char *str;
{
  char buf[CUTOFF+10];
  /*   caller should set need_space == 0 */
  /*   need_space = 0; */
  handle_linefeeds_and_spaces (1);
  if (pos + strlen (str) > CUTOFF)
    {
      if (prepend_space)
        {
          putchar ('\n');
          pos = strlen (tmp);
        }
      printf ("%s", tmp);
      tmp[0] = '\0';
      prepend_space = 0;
      while (pos + strlen (str) > CUTOFF)
        {
          printf ("%.*s\n", CUTOFF - pos, str);
          str = str + CUTOFF - pos;
          pos = 0;
        }
    }
  sprintf (buf, "%s", str);
  strcat (tmp, buf);
  pos += strlen (str);
}

void
output (head)
     Code *head;
{
  pos = 0;
  need_space = 0;
  prepend_space = 0;
  tmp[0] = '\0';
  
  while (head != NULL)
    {
      switch (head->type)
        {
        case START:
          puts ("%!PS-Adobe-2.0");
          while (head->next != NULL && head->next->type == COMMENT)
            {
              head = head->next;
              outline ("%%%%%s", head->d.comment);
            }
          output_folding ();
          break;
        case ARGUMENT:
          outstring (head->d.argument->newname);
          need_space++;
          break;
        case COMMAND:
          outstring (head->d.command->newname);
          need_space++;
          break;
        case DIRECT:
          need_space = 0;
          outstringf (1 + strlen (head->d.direct->newname), /* fixme !!! */
                      "/%s", head->d.direct->newname);
          need_space++;
          break;
        case STRING:
          need_space = 0;
          outstring (head->d.string);
          break;
        case BINSTRING:
          need_space = 0;
          outbinstring (head->d.binstring);
          break;
        case COMMENT:
          need_space = 0;
          outline ("%%%%%s", head->d.comment);
          break;
        case OPEN_BRACE:
          need_space = 0;
          outstring ("{");
          break;
        case CLOSE_BRACE:
          need_space = 0;
          outstring ("}");
          break;
        case OPEN_BRACKET:
          need_space = 0;
          outstring ("[");
          break;
        case CLOSE_BRACKET:
          need_space = 0;
          outstring ("]");
          break;
        }
      head = head->next;
    }
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.