root/usr/src/cmd/lp/lib/lp/set_pitch.c
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/*        All Rights Reserved   */


#ident  "%Z%%M% %I%     %E% SMI"        /* SVr4.0 1.9   */
/* EMACS_MODES: !fill, lnumb, !overwrite, !nodelete, !picture */

#include "string.h"
#include "stdlib.h"

#include "lp.h"
#include "lp.set.h"

extern char             *tparm();

short                   output_res_char         = -1,
                        output_res_line         = -1,
                        output_res_horz_inch    = -1,
                        output_res_vert_inch    = -1;

/**
 ** set_pitch()
 **/

int
#if     defined(__STDC__)
set_pitch (
        char *                  str,
        int                     which,
        int                     putout
)
#else
set_pitch (str, which, putout)
        char                    *str;
        int                     which,
                                putout;
#endif
{
        double                  xpi;

        int                     ixpi;

        short                   *output_res_p,
                                *output_res_inch_p;

        unsigned short          xpi_changes_res;

        char                    *rest,
                                *change_pitch,
                                *change_res,
                                *p;


        if (which == 'H') {

                tidbit ((char *)0, "cpi", &change_pitch);
                tidbit ((char *)0, "chr", &change_res);

                output_res_inch_p = &output_res_horz_inch;
                if (output_res_horz_inch == -1)
                        tidbit ((char *)0, "orhi", output_res_inch_p);

                output_res_p = &output_res_char;
                if (output_res_char == -1)
                        tidbit ((char *)0, "orc", output_res_p);

                tidbit ((char *)0, "cpix", &xpi_changes_res);

        } else {

                tidbit ((char *)0, "lpi", &change_pitch);;
                tidbit ((char *)0, "cvr", &change_res);;

                output_res_inch_p = &output_res_vert_inch;
                if (output_res_vert_inch == -1)
                        tidbit ((char *)0, "orvi", output_res_inch_p);

                output_res_p = &output_res_line;
                if (output_res_line == -1)
                        tidbit ((char *)0, "orl", output_res_p);

                tidbit ((char *)0, "lpix", &xpi_changes_res);;

        }

        xpi = strtod(str, &rest);
        if (which == 'H' && STREQU(str, NAME_PICA))
                ixpi = R(xpi = 10);

        else if (which == 'H' && STREQU(str, NAME_ELITE))
                ixpi = R(xpi = 12);

        else if (
                which == 'H'
             && (
                        STREQU(str, NAME_COMPRESSED)
                     || xpi >= N_COMPRESSED
                )
        ) {
                if (change_pitch) {

                        for (ixpi = MAX_COMPRESSED; ixpi; ixpi--)
                                if ((p = tparm(change_pitch, ixpi)) && *p)
                                        break;
                        if (!ixpi)
                                ixpi = 10;
                        xpi = (double)ixpi;

                } else if (change_res && *output_res_inch_p != -1) {

                        for (xpi = MAX_COMPRESSED; xpi >= 1.; xpi -= 1.)
                                if (
                        (p = tparm(change_res, R(*output_res_inch_p / xpi)))
                                     && *p
                                )
                                        break;
                        if (xpi < 1.)
                                xpi = 10.;
                        ixpi = R(xpi);

                } else
                        return (E_FAILURE);

        } else {

                if (xpi <= 0)
                        return (E_BAD_ARGS);

                switch (*rest) {
                case ' ':
                case 0:
                        break;
                case 'c':
                        /*
                         * Convert to [lines|chars] per inch.
                         */
                        xpi *= 2.54;
                        /* fall through */
                case 'i':
                        break;
                default:
                        return (E_BAD_ARGS);
                }

                ixpi = R(xpi);

        }

        if (
                *output_res_inch_p != -1
             && *output_res_p != -1
             && R(*output_res_inch_p / (double)*output_res_p) == ixpi
        )
                return (E_SUCCESS);

        else if (
                change_pitch
             && (p = tparm(change_pitch, ixpi))
             && *p
        ) {

                if (putout)
                        putp (p);
                if (xpi_changes_res) {
                        if (*output_res_inch_p != -1)
                                *output_res_inch_p = R(*output_res_p * xpi);
                } else {
                        if (*output_res_p != -1)
                                *output_res_p = R(*output_res_inch_p / xpi);
                }
                return (E_SUCCESS);

        } else if (
                change_res
             && *output_res_inch_p != -1
             && (p = tparm(change_res, R(*output_res_inch_p / xpi)))
             && *p
        ) {

                if (putout)
                        putp (p);
                if (*output_res_p != -1)
                        *output_res_p = R(*output_res_inch_p / xpi);
                return (E_SUCCESS);

        } else

                return (E_FAILURE);
}