#ident "%Z%%M% %I% %E% SMI"
#include "string.h"
#include "stdlib.h"
#include "lp.h"
#include "lp.set.h"
#if defined(__STDC__)
char * tparm ( char * , ... );
int putp ( char * );
int tidbit ( char * , char * , ... );
#else
extern char *tparm();
int putp();
int tidbit();
#endif
extern short output_res_char,
output_res_line,
output_res_horz_inch,
output_res_vert_inch;
int
#if defined(__STDC__)
set_size (
char * str,
int which,
int putout
)
#else
set_size (str, which, putout)
char *str;
int which,
putout;
#endif
{
static int cleared_margins_already = 0;
double size;
int i,
isize,
ret;
short curval,
output_res,
output_res_inch;
char *rest,
*set_margin1,
*set_margin2,
*set_margin1_parm,
*set_margin2_parm,
*set_both_margins = 0,
*move1,
*move2,
*step2,
*p1,
*p2,
*sp1,
*sp2,
*carriage_return,
*parm_right_cursor,
*column_address,
*repeat_char,
*cursor_right,
*parm_down_cursor,
*row_address,
*cursor_down,
*clear_margins,
*finale,
*slines;
if (which == 'W') {
tidbit ((char *)0, "cols", &curval);
if (output_res_char == -1)
tidbit ((char *)0, "orc", &output_res_char);
output_res = output_res_char;
if (output_res_horz_inch == -1)
tidbit ((char *)0, "orhi", &output_res_horz_inch);
output_res_inch = output_res_horz_inch;
} else {
tidbit ((char *)0, "lines", &curval);
if (output_res_line == -1)
tidbit ((char *)0, "orl", &output_res_line);
output_res = output_res_line;
if (output_res_vert_inch == -1)
tidbit ((char *)0, "orvi", &output_res_vert_inch);
output_res_inch = output_res_vert_inch;
}
size = strtod(str, &rest);
if (size <= 0)
return (E_BAD_ARGS);
switch (*rest) {
case ' ':
case 0:
break;
case 'c':
size /= 2.54;
case 'i':
if (output_res == -1 || output_res_inch == -1)
return (E_FAILURE);
size *= output_res_inch / output_res;
break;
default:
return (E_BAD_ARGS);
}
if ((isize = R(size)) == curval)
return (E_SUCCESS);
isize--;
if (which == 'W') {
tidbit ((char *)0, "smgl", &set_margin1);
tidbit ((char *)0, "smgr", &set_margin2);
tidbit ((char *)0, "smglp", &set_margin1_parm);
tidbit ((char *)0, "smgrp", &set_margin2_parm);
tidbit ((char *)0, "smglr", &set_both_margins);
tidbit ((char *)0, "cr", &carriage_return);
tidbit ((char *)0, "cuf", &parm_right_cursor);
tidbit ((char *)0, "hpa", &column_address);
tidbit ((char *)0, "rep", &repeat_char);
tidbit ((char *)0, "cuf1", &cursor_right);
if (OKAY(carriage_return))
move1 = carriage_return;
else
move1 = "\r";
if (OKAY(parm_right_cursor)) {
move2 = tparm(parm_right_cursor, isize);
step2 = 0;
} else if (OKAY(column_address)) {
move2 = tparm(column_address, isize);
step2 = 0;
} else if (OKAY(repeat_char)) {
move2 = tparm(repeat_char, ' ', isize);
step2 = 0;
} else if (OKAY(cursor_right)) {
move2 = 0;
step2 = cursor_right;
} else {
move2 = 0;
step2 = " ";
}
finale = move1;
} else {
tidbit ((char *)0, "smgt", &set_margin1);
tidbit ((char *)0, "smgb", &set_margin2);
tidbit ((char *)0, "smgtp", &set_margin1_parm);
tidbit ((char *)0, "smgbp", &set_margin2_parm);
tidbit ((char *)0, "smgtb", &set_both_margins);
slines = 0;
tidbit ((char *)0, "slines", &slines);
if (!OKAY(slines))
tidbit ((char *)0, "u9", &slines);
tidbit ((char *)0, "cud", &parm_down_cursor);
tidbit ((char *)0, "vpa", &row_address);
tidbit ((char *)0, "cud1", &cursor_down);
move1 = "";
if (OKAY(parm_down_cursor)) {
move2 = tparm(parm_down_cursor, isize);
step2 = 0;
} else if (OKAY(row_address)) {
move2 = tparm(row_address, isize);
step2 = 0;
} else if (OKAY(cursor_down)) {
move2 = 0;
step2 = cursor_down;
} else {
move2 = 0;
step2 = "\n";
}
tidbit ((char *)0, "ff", &finale);
}
if (!OKAY(set_both_margins)) {
if (OKAY(set_margin1_parm) && !OKAY(set_margin2_parm))
set_both_margins = set_margin1_parm;
else if (OKAY(set_margin2_parm) && !OKAY(set_margin1_parm))
set_both_margins = set_margin2_parm;
}
sp1 = sp2 = 0;
if (
which == 'L'
&& OKAY(slines)
&& (p1 = tparm(slines, isize + 1))
) {
if (putout)
putp (p1);
finale = 0;
ret = E_SUCCESS;
} else if (
OKAY(set_both_margins)
&& (p1 = tparm(set_both_margins, 0, isize))
&& *p1
&& (sp1 = Strdup(p1))
) {
if (putout) {
if (!cleared_margins_already) {
tidbit ((char *)0, "mgc", &clear_margins);
if (OKAY(clear_margins)) {
cleared_margins_already = 1;
putp (clear_margins);
}
}
putp (sp1);
}
ret = E_SUCCESS;
} else if (
OKAY(set_margin1_parm)
&& (p1 = tparm(set_margin1_parm, 0))
&& *p1
&& (sp1 = Strdup(p1))
&& OKAY(set_margin2_parm)
&& (p2 = tparm(set_margin2_parm, isize, 0))
&& *p2
&& (sp2 = Strdup(p2))
) {
if (putout) {
if (!cleared_margins_already) {
tidbit ((char *)0, "mgc", &clear_margins);
if (OKAY(clear_margins)) {
cleared_margins_already = 1;
putp (clear_margins);
}
}
putp (sp1);
putp (sp2);
}
ret = E_SUCCESS;
} else if (
OKAY(set_margin1)
&& OKAY(set_margin2)
&& (OKAY(move2) || OKAY(step2))
) {
register char *p,
*q;
register int free_it = 0;
if (putout) {
if (!cleared_margins_already) {
tidbit ((char *)0, "mgc", &clear_margins);
if (OKAY(clear_margins)) {
cleared_margins_already = 1;
putp (clear_margins);
}
}
putp (move1);
putp (set_margin1);
if (!move2) {
move2 = Malloc(isize * strlen(step2) + 1);
if (!move2)
return (E_MALLOC);
for (p = move2, i = 0; i < isize; i++)
for (q = step2; *q; )
*p++ = *q++;
*p = 0;
free_it = 1;
}
putp (move2);
putp (set_margin2);
if (free_it)
Free (move2);
}
ret = E_SUCCESS;
} else
ret = E_FAILURE;
if (putout && OKAY(finale))
putp (finale);
if (sp1)
Free (sp1);
if (sp2)
Free (sp2);
return (ret);
}