ftp.nice.ch/pub/next/tools/printer/lj2ps.s.tar.gz#/lj2ps/trans.c

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

/* Program:        lj2ps
** File:	   transform.c
**
** Author:	   Christopher Lishka
** Organization:   Wisconsin State Laboratory of Hygiene
**		   Data Processing Dept.
**
** Copyright (C) 1990 by Christopher Lishka.
**
** 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 1, 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, write to the Free Software
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

static char * ModuleID = "Module transform: v1.0.1.2, production";

  /* Include files
  */
#include <stdio.h>

#if defined (NeXT)
	#include	<stdlib.h>
#endif

#include "trans.h"
#include "scan.h"
#include "lj2ps.h"
#include "lj.h"

  /* External definitions
  */

  /* Global variables
  */

  /* Global function list
  */
extern void  transform();

  /* Local constants
  */

  /* Local structures and types
  */

  /* Local variables
  */

  /* Local macro definitions
  */
#define report(x)  fprintf(output_file, "%s", x);

  /* Local function list
  */

  /* Function bodies
  */

  /* transform() reads text mixed with laserjet commands from its input
  ** and "magically" changes it to postscript on its output.  The magic
  ** is performed in a tight while-loop which acts as a simple decision
  ** table: for each token type (command, text, parameter) the appropriate
  ** action is done (which usually involves writing to stdout or calling
  ** an emulation function).
  */
void
transform(input_file, output_file)
    FILE *input_file, *output_file;
{

    /* Reset the scanner to read from the input */
  scan_init(input_file);

    /* While the input stream still has tokens, handle each token through
    ** the switch() jump table.
    */
  scan_state = SS_TEXT;    		/* Set the initial scan state */
  while( scan() ){
#ifdef DEBUG
    if( debug ) fprintf(stderr, "{TOKEN:%d}", curr_token.code);
#endif
    switch( curr_token.code ){
    case TEXT_CHAR:
		if( (page_height - current_y) > (text_height + margin_top + LJ_ERROR) )
			{
			lj_page_end(output_file);
			lj_page_begin(output_file);
			}
      lj_text_add(output_file, text);
      break;
    case TEXT_NULL:		/* Ignore nulls */
      warning("encountered a null; ignoring", "");
      break;
    case TEXT_lp:
      lj_text_add(output_file, "\\(");
      break;
    case TEXT_rp:
      lj_text_add(output_file, "\\)");
      break;
    case TEXT_bslash:
      lj_text_add(output_file, "\\\\");
      break;
    case TEXT_NEWLINE:
		if( (page_height - current_y) > (text_height + margin_top + LJ_ERROR) )
			{
			lj_page_end(output_file);
			lj_page_begin(output_file);
			}
      lj_nl(output_file);	/* Write out a newline */
      current_line++;
      break;
    case TEXT_FORMFEED:
      lj_page_end(output_file);
      /* XXX insert page counting mechanism here! */
      lj_page_begin(output_file);
      break;
    case TEXT_TAB:
        /* XXX This should check for either font_p or font_s, and not assume
	**     font_p automatically!
	*/
      if( font_p.spacing == LJ_SP_PROPORTIONAL )
	warning("a tab is being used with a proportional font!", "");
      lj_text_end(output_file);
      fputs("TAB ", output_file);
      lj_text_begin();
      break;
    case TEXT_SH_IN:
      warning("shift-in is not yet supported -- ignoring", "");
      break;
    case TEXT_SH_OUT:
      warning("shift-out is not yet supported -- ignoring", "");
      break;
    case CMD_UNDEF:	ljcmd_undefined(input_file, output_file);   break;
    case CMD_E:		ljcmd_E(output_file);                       break;
    case CMD_Y:		ljcmd_Y(output_file);	                    break;
    case CMD_Z:		ljcmd_Z(output_file);	                    break;
    case CMD_9:		ljcmd_9(output_file);	                    break;
    case CMD_eq:	ljcmd_eq(output_file);	                    break;
    case CMD_lp:	ljcmd_lp(input_file, output_file);	    break;
    case CMD_rp:	ljcmd_rp(input_file, output_file);	    break;
    case CMD_lp_s:	ljcmd_lp_s(input_file, output_file);	    break;
    case CMD_rp_s:	ljcmd_rp_s(input_file, output_file);	    break;
    case CMD_amp_a:	ljcmd_amp_a(input_file, output_file);	    break;
    case CMD_amp_d:	ljcmd_amp_d(input_file, output_file);	    break;
    case CMD_amp_f:	ljcmd_amp_f(input_file, output_file);	    break;
    case CMD_amp_k:     ljcmd_amp_k(input_file, output_file);       break;
    case CMD_amp_l:	ljcmd_amp_l(input_file, output_file);	    break;
    case CMD_amp_p:	ljcmd_amp_p(input_file, output_file);	    break;
    case CMD_amp_s:	ljcmd_amp_s(input_file, output_file);	    break;
    case CMD_star_b:    ljcmd_star_b(input_file, output_file);      break;
    case CMD_star_c:	ljcmd_star_c(input_file, output_file);	    break;
    case CMD_star_p:	ljcmd_star_p(input_file, output_file);	    break;
    case CMD_star_r:	ljcmd_star_r(input_file, output_file);	    break;
    case CMD_star_t:	ljcmd_star_t(input_file, output_file);	    break;
    case PARAM_CONTINUE:
    case PARAM_END:
      internal_error("(end)parameter found in transform()", variable);
      break;
    default:
      internal_error("illegal token encountered in transform()", "");
    } /* switch(...) */
  } /* while(...) */

} /* transform() */



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