home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-08-12 | 44.7 KB | 1,483 lines |
- #!/bin/sh
- # This is part 04 of a multipart archive
- if touch 2>&1 | fgrep '[-amc]' > /dev/null
- then TOUCH=touch
- else TOUCH=true
- fi
- # ============= help.c ==============
- echo "x - extracting help.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > help.c &&
- X/* help.c */
- X/**********************************************************************
- X* File Name : help.c
- X* Function : overlay stack window with help list
- X* Author : Istvan Mohos, 1987
- X***********************************************************************/
- X
- X#include "defs.h"
- X#include "toktab.h"
- X
- Xchar *hlist[] = {
- X"! factorial of n: 2*3*4*...n",
- X"# comment from here to EOL ",
- X"\' sum ASCII bytes of nextok ",
- X"; separator btw. statements ",
- X"? abbreviation for help ",
- X"X literal 16 ",
- X"\\ most recent result ",
- X"amass atomic mass unit, grams ",
- X"and binary bit-wise AND ",
- X"arct a(x) bc arctangent func. ",
- X"astro astronomical unit, km ",
- X"at abbreviation for autotime ",
- X"atto * .000 000 000 000 000 001",
- X"au abbreviation for autoconv ",
- X"auto pac_err: defeat bc keyword",
- X"autoconv on/off continuous convert ",
- X"autotime turn clock on/off at start",
- X"avogadro molecules per gram mole ",
- X"boltzmann constant [k] ergs/Kelvin ",
- X"break pac_err: defeat bc keyword",
- X"bye exit program; same as TAB ",
- X"chroma 440 * chroma: Bflat from A",
- X"clr clear stack cell nextok ",
- X"cm use comma to format number",
- X"comma use comma to format number",
- X"cos c(x) bc cosine function ",
- X"define pac_err: defeat bc keyword",
- X"dontsave don't write vars to .pacrc",
- X"dp same as precision ",
- X"ds abbreviation for dontsave ",
- X"dup duplicate stk cell nextok ",
- X"earthmass mass of earth in kg ",
- X"earthrad radius of earth in meters ",
- X"echarge electron charge [e] esu ",
- X"emass electron mass at rest, g ",
- X"euler Euler-Mascheroni constant ",
- X"exa *1,000,000,000,000,000,000",
- X"exit exit program; same as ^E ",
- X"exp e(x) bc exponential func. ",
- X"faraday constant [F] C/kmole ",
- X"femto * .000 000 000 000 001 ",
- X"fix show fixed decimal point ",
- X"fo abbreviation for format ",
- X"for pac_err: defeat bc keyword",
- X"format commas/spaces in result ",
- X"g acceleration at sea m/s2 ",
- X"gas constant [Ro] erg/g mole K",
- X"giga * 1,000,000,000 ",
- X"gravity constant [G] N m2/kg2 ",
- X"h value of stack cell h ",
- X"hardform verbose/terse/xt filedump ",
- X"heat mechanical equiv [J] J/cal",
- X"help briefly explain next token",
- X"hf abbreviation for hardform ",
- X"i value of stack cell i ",
- X"ib abbreviation for ibase ",
- X"ibase input radix (2 through 16)",
- X"if pac_err: defeat bc keyword",
- X"init pac to default parameters ",
- X"j value of stack cell j ",
- X"ju abbreviation for justify ",
- X"justify left/right/fix display ",
- X"k value of stack cell k ",
- X"kilo * 1000 ",
- X"l value of stack cell l ",
- X"le abbreviation for left ",
- X"left ju le; print to left side ",
- X"length pac_err: defeat bc keyword",
- X"light velocity [c] km/s ",
- X"lightyear distance covered/year km ",
- X"log l(x) bc log function ",
- X"m value of stack cell m ",
- X"mega * 1,000,000 ",
- X"micro * .000 001 ",
- X"milli * .001 ",
- X"mod integer mod, unlike bc % ",
- X"mohos clear to nextok, pactrace ",
- X"moonmass lunar mass in kg ",
- X"moonrad radius of moon in meters ",
- X"n value of stack cell n ",
- X"nano * .000 000 001 ",
- X"natural Naperian log base [e] ",
- X"nmass neutron mass at rest, g ",
- X"not bitwise, field nextok wide",
- X"o value of stack cell o ",
- X"ob abbreviation of obase ",
- X"obase output radix (2 thru 16) ",
- X"off disable capability ",
- X"on enable capability ",
- X"or binary, bit-wise OR ",
- X"p value of stack cell p ",
- X"parallax solar, in seconds of arc ",
- X"parsec (parallax + sec2) in km ",
- X"pd percent diff (pdiff) ",
- X"pdelta percent diff (pdiff) ",
- X"pdiff % diff of curtok to nextok",
- X"pe percent equal (pequal) ",
- X"pequal curtok% = nextok; total? ",
- X"peta * 1,000,000,000,000,000 ",
- X"pi 3.1415... (32 hex digits) ",
- X"pico * .000 000 000 001 ",
- X"planck constant [h] erg sec ",
- X"pll stk cell nextok to curres ",
- X"pm percent minus (pminus) ",
- X"pmass proton mass at rest, g ",
- X"pminus subtract nextok percent ",
- X"po percent of (pof) ",
- X"pof what is curtok% of nextok ",
- X"pop discard stack cell nextok ",
- X"pp percent plus (pplus) ",
- X"pplus add nextok percent ",
- X"pr abbreviation of precision ",
- X"precision digits used past dp (0-32)",
- X"psh curres to stk cell nextok ",
- X"pv percent versus (pversus) ",
- X"pversus curtok = 100 %, nextok ? %",
- X"q value of stack cell q ",
- X"quit exit program; same as ^E ",
- X"r value of stack cell r ",
- X"ri abbreviation of right ",
- X"right right justify result ",
- X"rydberg constant per meter ",
- X"s value of stack cell s ",
- X"sb abbreviation of staybase ",
- X"scale alias of precision ",
- X"sin s(x) bc sine function ",
- X"sound air speed @ 15 Celsius m/s",
- X"sp use space to format number",
- X"space use space to format number",
- X"sqrt sqrt(x) bc square root ",
- X"st abbreviation of 'stack on'",
- X"stack save last 16 results ",
- X"staybase make next radix permanent ",
- X"stefan Stefan-Boltzmann J/m2 K4 s",
- X"sto store curres in stack cell",
- X"sunmass solar mass kg ",
- X"sunrad radius of sun in meters ",
- X"swp swap curres, stack nextok ",
- X"t value of stack cell t ",
- X"te abbreviation of terse ",
- X"tera * 1,000,000,000,000 ",
- X"terse hardcopy file format ",
- X"to convert curres to nextok ",
- X"tomoon distance from earth, km ",
- X"tosun distance from earth, km ",
- X"tw abbreviation of twoscomp ",
- X"twoscomp bitwise, field nextok wide",
- X"u value of stack cell u ",
- X"v value of stack cell v ",
- X"ver abbreviation of verbose ",
- X"verbose hardcopy file format ",
- X"w value of stack cell w ",
- X"while pac_err: defeat bc keyword",
- X"wien displacement constant cm K",
- X"x the number 16 ",
- X"xor curres xor-ed with nextok ",
- X"xt abbreviation of xterse ",
- X"xterse hardcopy file format ",
- X};
- X
- X#define HCENTER 6
- X#define TOFIT (STACKDEEP - HCENTER)
- X
- Xshow_help(cursel)
- Xint cursel;
- X{
- X register ri;
- X static int tophelp;
- X static char *fid = "show_help";
- X
- X _TR
- X if (cursel < HCENTER)
- X tophelp = 0;
- X else if (cursel >= LISTSIZE - TOFIT)
- X tophelp = LISTSIZE - STACKDEEP;
- X else
- X tophelp = cursel - HCENTER + 1;
- X
- X for (ri = 0; ri < STACKDEEP; ri++) {
- X mvaddstr(ri + STACKTOP, STACKLEFT, hlist[ri + tophelp]);
- X }
- X
- X standout();
- X for (ri = 0; ri < STACKDEEP; ri++) {
- X mvaddch(ri + STACKTOP, LBOUND, ' ');
- X }
- X mvaddstr(STACKTOP + cursel - tophelp, STACKLEFT, hlist[cursel]);
- X standend();
- XTR_
- X}
- X
- SHAR_EOF
- $TOUCH -am 0221163890 help.c &&
- chmod 0644 help.c ||
- echo "restore of help.c failed"
- set `wc -c help.c`;Wc_c=$1
- if test "$Wc_c" != "7333"; then
- echo original size 7333, current size $Wc_c
- fi
- # ============= ierror.c ==============
- echo "x - extracting ierror.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > ierror.c &&
- X/* ierror.c */
- X/**********************************************************************
- X* Function : perror, writes into global string buffer "ierbuf"
- X* Author : Istvan Mohos, 1987
- X***********************************************************************/
- X
- X#include <stdio.h>
- Xextern int errno, sys_nerr;
- Xextern char *sys_errlist[];
- Xextern char ierbuf[];
- X
- Xierror(ustr, badnum)
- Xchar *ustr;
- Xint badnum;
- X{
- X register char *cp = NULL;
- X
- X if (errno > 0 && errno < sys_nerr) {
- X badnum = errno;
- X cp = sys_errlist[errno];
- X }
- X
- X if (ustr != (char *)NULL)
- X if (cp != (char *)NULL)
- X sprintf(ierbuf, "%s: %s", cp, ustr);
- X else
- X strcpy(ierbuf, ustr);
- X else
- X if (cp != (char *)NULL)
- X sprintf(ierbuf, "%s:", cp);
- X else
- X *ierbuf = '\0';
- X
- X errno = 0;
- X return(badnum);
- X}
- SHAR_EOF
- $TOUCH -am 0221163890 ierror.c &&
- chmod 0644 ierror.c ||
- echo "restore of ierror.c failed"
- set `wc -c ierror.c`;Wc_c=$1
- if test "$Wc_c" != "871"; then
- echo original size 871, current size $Wc_c
- fi
- # ============= interpret.c ==============
- echo "x - extracting interpret.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > interpret.c &&
- X/* interpret.c */
- X/**********************************************************************
- X* File Name : interpret.c
- X* Function : pac calculator input tokenizer
- X* Author : Istvan Mohos, 1987
- X***********************************************************************/
- X
- X#include "defs.h"
- X#include "toktab.h"
- X#define INTERMAP
- X#include "maps.h"
- X#undef INTERMAP
- X
- X#define HIDE_RES Hide = 1; rh = Stack; Stack = DISA; \
- X prec = Precision; Precision = 32; show_result(1); \
- X Hide = 0; Stack = rh; Precision = prec
- X#define RECOVER conv_bc(sr->cell, ZERO, 1, 0); addto_ubuf(Convbuf)
- X
- Xinterpret(source)
- Xchar *source;
- X{
- X char *eye, *nxeye;
- X char *ip, itemp[LINEMAX];
- X char stacbuf[PIPEMAX];
- X int ri, rh, prec;
- X int cur_cnt = 0;
- X int type, value, nex_type;
- X int first; /* so conversion can refer to Mainbuf */
- X int conv_flag; /* to show that TO has taken place */
- X char c_val;
- X static char onechar[2];
- X static struct stk_cell *sr = &Stk[0];
- X static char *fid = "interpret";
- X
- X _TR
- X
- X#ifdef TOX
- X static char Tk[100];
- X char *tk = &Tk[0];
- X#endif
- X
- X
- X /* transfer raw characters from user window to Spreadbuf,
- X insert spaces between all but contiguous alphanumeric characters
- X to prepare for pactok */
- X fill_spreadbuf(source);
- X
- X /* strip spaces and commas, null terminate tokens */
- X place_pointers();
- X *Ubuf = '\0';
- X *Controlbuf = '\0';
- X first = TRUE;
- X conv_flag = FALSE;
- X
- X while ((eye = Tokp[++cur_cnt]) != ZERO) {
- X type = lookup(eye);
- X
- X if ((nxeye = Tokp[cur_cnt + 1]) != ZERO)
- X nex_type = lookup(nxeye);
- X else
- X nex_type = -1;
- X
- X#ifdef TOX
- X sprintf(tk, "%d,", type);
- X tk = Tk + strlen(Tk);
- X#endif
- X
- X switch(type) {
- X
- X default:
- X case NOTINLIST:
- X upcase(eye);
- X addto_ubuf(eye);
- X break;
- X
- X case IB:
- X case IBASE:
- X show_result(1);
- X
- X /* ZERO pointer: no more tokens
- X Convbuf returned: next token not in preferred list
- X in either case, leave right side alone */
- X
- X if ((eye = substivar(-1, Tokp[++cur_cnt], 10))
- X == ZERO || eye == Convbuf) {
- X --cur_cnt;
- X Ibase = IB_DFLT;
- X }
- X else {
- X conv_bc(eye, ZERO, Ibase, 10);
- X Ibase = atoi(Convbuf);
- X if (Ibase > 16 || Ibase < 2)
- X Ibase = IB_DFLT;
- X }
- X sprintf(Mop, "ibase=A;ibase=%d\n",Ibase);
- X addto_controlbuf(Mop);
- X show_result(0);
- X break;
- X
- X case OB:
- X case OBASE:
- X show_result(1);
- X if ((eye = substivar(-1, Tokp[++cur_cnt], 10))
- X == ZERO || eye == Convbuf) {
- X --cur_cnt;
- X Obase = OB_DFLT;
- X }
- X else {
- X conv_bc(eye, ZERO, Ibase, 10);
- X Obase = atoi(Convbuf);
- X if (Obase > 16 || Obase < 2)
- X Obase = OB_DFLT;
- X }
- X sprintf(Mop, "ibase=A;obase=%d;ibase=%d\n", Obase, Ibase);
- X addto_controlbuf(Mop);
- X show_result(0);
- X break;
- X
- X case TE:
- X case TERSE:
- X case VER:
- X case VERBOSE:
- X case XT:
- X case XTERSE:
- X show_result(1);
- X if (type == TE || type == TERSE)
- X Hf = FTER;
- X else if (type == VER || type == VERBOSE)
- X Hf = FVER;
- X else
- X Hf = FXTER;
- X show_result(0);
- X break;
- X
- X case FIX:
- X case RIGHT:
- X case RI:
- X case LE:
- X case LEFT:
- X case CM:
- X case COMMA:
- X case SP:
- X case SPACE:
- X show_result(1);
- X if (type == FIX)
- X Justify = JF;
- X else if (type == RIGHT || type == RI)
- X Justify = JR;
- X else if (type == LE || type == LEFT)
- X Justify = JL;
- X else if (type == CM || type == COMMA)
- X Separator = ',', Format = COMMA_;
- X else if (type == SP || type == SPACE)
- X Separator = ' ', Format = SPACE_;
- X show_result(0);
- X break;
- X
- X case QUESTION:
- X case HELP:
- X if (nex_type == -1)
- X show_help(HELP);
- X else {
- X ++cur_cnt;
- X show_help(nex_type);
- X }
- X break;
- X
- X case TO:
- X if (!first) {
- X HIDE_RES;
- X }
- X RECOVER;
- X eye = Tokp[++cur_cnt];
- X if (eye == ZERO)
- X --cur_cnt;
- X else if ((ri = conv_id(eye)) != -1)
- X Convsel = ri;
- X else
- X --cur_cnt;
- X Do_conv = conv_flag = TRUE;
- X HIDE_RES;
- X show_result(0);
- X RECOVER;
- X break;
- X
- X case AND:
- X case OR:
- X case XOR:
- X if (!first) {
- X HIDE_RES;
- X }
- X /* resolve left side; convert it to base 2 */
- X conv_bc(sr->cell, ZERO, 1, 2);
- X strcpy(itemp, Convbuf);
- X
- X if ((eye = substivar(-1, Tokp[++cur_cnt], 2))
- X == ZERO || eye == Convbuf)
- X --cur_cnt, eye = itemp;
- X else if (eye == Tokp[cur_cnt]) {
- X /* nextok is a digit string */
- X conv_bc(eye, ZERO, -1, 2);
- X eye = Convbuf;
- X }
- X if ((ip = bitwise(type, itemp, eye, &ri)) == ZERO) {
- X pac_err("conversion range");
- X TR_
- X return;
- X }
- X conv_bc(ip, ZERO, 1, 0);
- X addto_ubuf(Convbuf);
- X HIDE_RES;
- X RECOVER;
- X break;
- X
- X case TW:
- X case TWOSCOMP:
- X case NOT:
- X if (type == TWOSCOMP)
- X type = TW;
- X if (!first) {
- X HIDE_RES;
- X }
- X /* resolve left side; convert it to base 2 */
- X conv_bc(sr->cell, ZERO, 1, 2);
- X strcpy(itemp, Convbuf);
- X
- X if ((eye = substivar(-1, Tokp[++cur_cnt], 10))
- X == ZERO || eye == Convbuf) {
- X --cur_cnt;
- X /* reuse previous result */
- X conv_bc(sr->cell, ZERO, 1, 10);
- X eye = Convbuf;
- X }
- X else if (eye == Tokp[cur_cnt]) {
- X /* nextok is a digit string */
- X conv_bc(eye, ZERO, -1, 10);
- X eye = Convbuf;
- X }
- X if ((ip = bitwise(type, itemp, eye, &ri)) == ZERO) {
- X pac_err("conversion range");
- X TR_
- X return;
- X }
- X if (ri)
- X addto_ubuf("-");
- X conv_bc(ip, ZERO, 1, 0);
- X addto_ubuf(Convbuf);
- X if (type == TW)
- X addto_ubuf((ri) ? "-1" : "+1");
- X HIDE_RES;
- X RECOVER;
- X break;
- X
- X case MOD:
- X if (!first) {
- X HIDE_RES;
- X }
- X ri = Precision;
- X sprintf(Mop,"ibase=A;scale=0;ibase=%d\n", Ibase);
- X addto_controlbuf(Mop);
- X show_result(0);
- X conv_bc(sr->cell, ZERO, 1, 0);
- X addto_ubuf(Convbuf);
- X addto_ubuf("\%");
- X if ((eye = substivar(-1, Tokp[++cur_cnt], 0))
- X == ZERO || eye == Convbuf) {
- X --cur_cnt;
- X eye = Convbuf;
- X }
- X addto_ubuf(eye);
- X HIDE_RES;
- X sprintf(Mop,"ibase=A;scale=%d;ibase=%d\n",ri, Ibase);
- X addto_controlbuf(Mop);
- X show_result(0);
- X RECOVER;
- X break;
- X
- X case BANG:
- X if (!first) {
- X HIDE_RES;
- X }
- X /* resolve left side; convert it to base 10 */
- X conv_bc(sr->cell, ZERO, 1, 10);
- X value = atoi(Convbuf);
- X if (value < 0)
- X value = 0;
- X else if (value > 35)
- X value = 35;
- X conv_bc(factab[value], ZERO, 1, 0);
- X addto_ubuf(Convbuf);
- X HIDE_RES;
- X RECOVER;
- X break;
- X
- X case JUSTIFY:
- X case JU:
- X eye = Tokp[++cur_cnt];
- X if (eye == ZERO) {
- X show_result(1);
- X Justify = JUS_DFLT;
- X show_result(0);
- X }
- X --cur_cnt;
- X break;
- X
- X case HF:
- X case HARDFORM:
- X eye = Tokp[++cur_cnt];
- X if (eye == ZERO) {
- X show_result(1);
- X Hf = HF_DFLT;
- X show_result(0);
- X }
- X --cur_cnt;
- X break;
- X
- X case SHARP: /* comment start */
- X (conv_flag || Autoconv == ENA) ? (O_conv = TRUE)
- X : (O_conv = FALSE);
- X show_result(2);
- X TR_
- X return;
- X
- X case SEMI:
- X show_result(1);
- X first = 2;
- X break;
- X
- X case STACK:
- X case ST:
- X case SB:
- X case STAYBASE:
- X case AUTOTIME:
- X case AT:
- X ip = stacbuf;
- X ri = 0;
- X show_result(1);
- X eye = Tokp[++cur_cnt];
- X if (eye == ZERO) {
- X --cur_cnt;
- X if (type == STACK || type == ST)
- X (Stack == ENA) ? (ri = 1) : (Stack = ENA);
- X else if (type == STAYBASE || type == SB)
- X Staybase = ENA;
- X else if (type == AUTOTIME || type == AT)
- X Autotime = ENA;
- X show_result(0);
- X }
- X else {
- X value = lookup(eye);
- X if (value == ON)
- X value = ENA;
- X else if (value == OFF)
- X value = DISA;
- X else {
- X --cur_cnt;
- X value = ENA;
- X }
- X if (type == STACK || type == ST) {
- X if (value == ENA && Stack == ENA)
- X ri = 1;
- X Stack = value;
- X }
- X else if (type == STAYBASE || type == SB)
- X Staybase = value;
- X else if (type == AUTOTIME || type == AT)
- X Autotime = value;
- X show_result(0);
- X }
- X if (Hc != -1 && ri) {
- X save_stack(ip, 1);
- X ri = strlen(stacbuf);
- X if ((write(Hc, stacbuf, ri)) != ri)
- X fatal("hardcopy stack write");
- X }
- X break;
- X
- X case FORMAT:
- X case FO:
- X show_result(1);
- X eye = Tokp[++cur_cnt];
- X if (eye == ZERO) {
- X --cur_cnt;
- X Format = FORM_DFLT;
- X (FORM_DFLT == COMMA_) ? (Separator = '.')
- X : (Separator = ' ');
- X }
- X else {
- X value = lookup(eye);
- X switch (value) {
- X case CM:
- X case COMMA:
- X Separator = ',';
- X Format = COMMA_;
- X break;
- X default:
- X --cur_cnt;
- X Format = FORM_DFLT;
- X (FORM_DFLT == COMMA_) ? (Separator = '.')
- X : (Separator = ' ');
- X break;
- X case SP:
- X case SPACE:
- X Separator = ' ';
- X Format = SPACE_;
- X break;
- X case OFF:
- X Separator = ' ';
- X Format = DISA;
- X break;
- X }
- X }
- X show_result(0);
- X break;
- X
- X case PR:
- X case PRECISION:
- X case SCALE:
- X case DP:
- X show_result(1);
- X /* get right side literal for input */
- X if ((eye = substivar(-1, Tokp[++cur_cnt], 10))
- X == ZERO || eye == Convbuf) {
- X --cur_cnt;
- X Precision = PREC_DFLT;
- X }
- X else {
- X Precision = atoi(eye);
- X if (Precision < 0 || Precision > 32)
- X Precision = PREC_DFLT;
- X }
- X sprintf(Mop,"ibase=A;scale=%d;ibase=%d\n",Precision, Ibase);
- X addto_controlbuf(Mop);
- X show_result(0);
- X break;
- X
- X case PP: /* PercentPlus */
- X case PPLUS:
- X case PM: /* PercentMinus */
- X case PMINUS:
- X case PD: /* PercentDelta */
- X case PDELTA:
- X case PDIFF:
- X case PV: /* PercentVersus */
- X case PVERSUS:
- X case PO: /* PercentOf */
- X case POF:
- X case PE: /* PercentEqual */
- X case PEQUAL:
- X if (!first) {
- X HIDE_RES;
- X }
- X conv_bc(sr->cell, ZERO, 1, 0); /* left side is input */
- X
- X /* get right side literal for input */
- X if ((eye = substivar(-1, Tokp[++cur_cnt], 0))
- X == ZERO || eye == Convbuf) {
- X --cur_cnt;
- X eye = Convbuf;
- X }
- X ip = itemp;
- X switch (type) {
- X case PP:
- X case PPLUS:
- X sprintf(ip, "%s+(%s*%s/%s)",
- X Convbuf,Convbuf,eye,hundred[Ibase]);
- X break;
- X case PM:
- X case PMINUS:
- X sprintf(ip, "%s-(%s*%s/%s)",
- X Convbuf,Convbuf,eye,hundred[Ibase]);
- X break;
- X case PV:
- X case PVERSUS:
- X sprintf(ip, "%s*%s/%s",
- X eye,hundred[Ibase],Convbuf);
- X break;
- X case PD:
- X case PDELTA:
- X case PDIFF:
- X sprintf(ip, "(%s*(%s-%s))/%s",
- X hundred[Ibase],eye,Convbuf,Convbuf);
- X break;
- X case PO:
- X case POF:
- X sprintf(ip, "(%s*%s/%s)",
- X eye,Convbuf,hundred[Ibase]);
- X break;
- X case PE:
- X case PEQUAL:
- X sprintf(ip, "(%s*%s/%s)",
- X eye,hundred[Ibase],Convbuf);
- X break;
- X }
- X addto_ubuf(ip);
- X break;
- X
- X case LOG:
- X *onechar = *eye;
- X addto_ubuf(onechar);
- X break;
- X
- X case SQRT:
- X addto_ubuf(eye);
- X break;
- X
- X case INIT_:
- X show_result(1);
- X pacinit();
- X sprintf(Mop, "ibase=A;obase=%d;ibase=%d\n", Obase, Ibase);
- X addto_controlbuf(Mop);
- X show_result(0);
- X break;
- X
- X case DONTSAVE:
- X case DS:
- X Dontsave = 1;
- X break;
- X
- X /* copy accum into chosen stack cell, or onto top of stack.
- X Other cells are not disturbed */
- X case STO:
- X show_result(1);
- X if (nxeye == ZERO || strlen(nxeye) > 1 ||
- X (strlen(nxeye) == 1 && (*nxeye < 'h' || *nxeye > 'w')))
- X c_val = 'h';
- X else {
- X c_val = *nxeye;
- X ++cur_cnt;
- X }
- X stack_reg(c_val - 'g', 0);
- X break;
- X
- X case IF:
- X case WHILE:
- X case FOR:
- X case BREAK:
- X case DEFINE:
- X case LENGTH:
- X pac_err("unimplemented key");
- X TR_
- X return;
- X
- X case QUIT:
- X case EXIT:
- X go_away(ZERO, 0);
- X
- X case BYE:
- X clearstack(0);
- X Amt = Rate = Years = 0.;
- X go_away("I", 0);
- X
- X /* value = sum of bytes' ascii values of next token are
- X substituted (in current Ibase) in input to bc */
- X case TICK:
- X value = 0;
- X if ((eye = Tokp[++cur_cnt]) == ZERO)
- X --cur_cnt;
- X else
- X while (*eye)
- X value += *eye++;
- X sprintf(Mop, "%c %d",Base_str[10], value);
- X conv_bc(Mop, ZERO, 1, 0);
- X addto_ubuf(Convbuf);
- X break;
- X
- X case BACKSLASH:
- X RECOVER;
- X break;
- X
- X case KILO:
- X case ATTO:
- X case FEMTO:
- X case GIGA:
- X case MEGA:
- X case MICRO:
- X case MILLI:
- X case NANO:
- X case PICO:
- X case TERA:
- X case PETA:
- X case EXA:
- X if (first) {
- X RECOVER;
- X }
- X addto_ubuf("*");
- X addto_ubuf(substivar(type, ZERO, Ibase));
- X break;
- X
- X case X_LOWER:
- X case X_UPPER:
- X sprintf(itemp, "%s", sixteen[Ibase]);
- X addto_ubuf(itemp);
- X break;
- X
- X /* shift Stack down from named register (or top, if no arg);
- X bottom gets lost. Copy accum into named element.
- X works independently (in addition to) stack effect */
- X case PSH:
- X show_result(1);
- X if (nxeye == ZERO || strlen(nxeye) > 1 ||
- X (strlen(nxeye) == 1 && (*nxeye < 'h' || *nxeye > 'w'))) {
- X pushstack(1);
- X stack_reg(1, 0);
- X }
- X else {
- X pushstack(*nxeye - 'g');
- X stack_reg(*nxeye - 'g', 0);
- X ++cur_cnt;
- X }
- X break;
- X
- X /* Move stack element (or top, if no arg) into accum, move up
- X all elements below it. Move 0 into bottom location */
- X case PLL:
- X show_result(1);
- X if (nxeye == ZERO || strlen(nxeye) > 1 ||
- X (strlen(nxeye) == 1 && (*nxeye < 'h' || *nxeye > 'w'))) {
- X onereg(1);
- X popstack(1);
- X }
- X else {
- X onereg(*nxeye - 'g');
- X popstack(*nxeye - 'g');
- X ++cur_cnt;
- X }
- X conv_bc(Onebuf, ZERO, 1, 0);
- X addto_ubuf(Convbuf);
- X HIDE_RES;
- X break;
- X
- X /* Swap accum and stacktop (no args), or accum and cell (1 arg),
- X other registers remain intact */
- X case SWP:
- X show_result(1);
- X if (nxeye == ZERO || strlen(nxeye) > 1 ||
- X (strlen(nxeye) == 1 && (*nxeye < 'h' || *nxeye > 'w'))) {
- X onereg(1);
- X stack_reg(1, 0);
- X }
- X else {
- X onereg(*nxeye - 'g');
- X stack_reg(*nxeye - 'g', 0);
- X ++cur_cnt;
- X }
- X conv_bc(Onebuf, ZERO, 1, 0);
- X addto_ubuf(Convbuf);
- X HIDE_RES;
- X break;
- X
- X /* Discard top of stack, (no args) or named stack cell (1 arg);
- X move up lower locations. Move 0 into bottom location */
- X case POP:
- X show_result(1);
- X if (nxeye == ZERO || strlen(nxeye) > 1 ||
- X (strlen(nxeye) == 1 && (*nxeye < 'h' || *nxeye > 'w')))
- X popstack(1);
- X else {
- X popstack(*nxeye - 'g');
- X ++cur_cnt;
- X }
- X break;
- X
- X case MOHOS:
- X#ifdef TRACE
- X if (first) {
- X Trace = !Trace;
- X if (Trace && Tf == NULL) {
- X Tlev = 18; /* pop 2 off 20 maxdeep tabs */
- X if ((Tf = fopen("pactrace", "w")) == NULL)
- X go_away("bad trace file", 1);
- X }
- X if (!Trace && Tf != NULL) {
- X fclose(Tf);
- X Tf = NULL;
- X }
- X }
- X#endif
- X *Ubuf = '\0';
- X *Controlbuf = '\0';
- X first = TRUE;
- X conv_flag = FALSE;
- X break;
- X
- X case PI:
- X case ASTRO:
- X case AMASS:
- X case AVOGADRO:
- X case BOLTZMANN:
- X case ECHARGE:
- X case CHROMA:
- X case EMASS:
- X case EULER:
- X case FARADAY:
- X case G_:
- X case GAS:
- X case GRAVITY:
- X case HEAT:
- X case LIGHT:
- X case LIGHTYEAR:
- X case MOONMASS:
- X case SUNMASS:
- X case EARTHMASS:
- X case NATURAL:
- X case NMASS:
- X case PARSEC:
- X case PARALLAX:
- X case PLANCK:
- X case PMASS:
- X case MOONRAD:
- X case SUNRAD:
- X case EARTHRAD:
- X case RYDBERG:
- X case SOUND:
- X case STEFAN:
- X case TOMOON:
- X case TOSUN:
- X case WIEN:
- X addto_ubuf(substivar(type, ZERO, Ibase));
- X break;
- X
- X case H_:
- X case I_:
- X case J_:
- X case K_:
- X case L_:
- X case M_:
- X case N_:
- X case O_:
- X case P_:
- X case Q_:
- X case R_:
- X case S_:
- X case T_:
- X case U_:
- X case V_:
- X case W_:
- X conv_bc((char *)find(*eye - 'g'), ZERO, 1, 0);
- X addto_ubuf(Convbuf);
- X break;
- X
- X case SIN:
- X case COS:
- X case EXP:
- X case ARCT:
- X if (Ibase != 10) {
- X pac_err("active in 10 base only");
- X TR_
- X return;
- X }
- X *onechar = *eye;
- X addto_ubuf(onechar);
- X break;
- X
- X /* Put 0 into a specific stack cell, or into
- X all cells including accum */
- X case CLR:
- X if (nxeye == ZERO || strlen(nxeye) > 1 ||
- X (strlen(nxeye) == 1 && (*nxeye < 'h' || *nxeye > 'w'))) {
- X clearstack(0);
- X addto_ubuf(";0;");
- X }
- X else {
- X clearstack(*nxeye - 'g');
- X ++cur_cnt;
- X }
- X show_result(1);
- X break;
- X
- X /* Values below named cell (or top) move down, bottom gets lost,
- X named cell is copied into cell below */
- X case DUP:
- X show_result(1);
- X if (nxeye == ZERO || strlen(nxeye) > 1 ||
- X (strlen(nxeye) == 1 && (*nxeye < 'h' || *nxeye > 'w'))) {
- X stack_reg('w' - 'g', 0); /* copy it into W first */
- X pushstack(1);
- X }
- X else {
- X stack_reg('w' - 'g', *nxeye - 'g');
- X pushstack(*nxeye - 'g');
- X ++cur_cnt;
- X }
- X break;
- X
- X /* Turn continuous conversion on/off */
- X case AU:
- X case AUTO:
- X case AUTOCONV:
- X show_result(1);
- X Do_conv = TRUE;
- X eye = Tokp[++cur_cnt];
- X if (eye == ZERO) {
- X --cur_cnt;
- X Autoconv = ENA;
- X show_result(0);
- X break;
- X }
- X value = lookup(eye);
- X if (value != ON && value != OFF) {
- X --cur_cnt;
- X Autoconv = ENA;
- X }
- X else if (value == ON)
- X Autoconv = ENA;
- X else {
- X Autoconv = DISA;
- X Do_conv = FALSE;
- X }
- X show_result(0);
- X break;
- X
- X }
- X (first == 2) ? (first = TRUE) : (first = FALSE);
- X /* FALSE after evaluating the first token */
- X }
- X (conv_flag || Autoconv == ENA) ? (O_conv = TRUE) : (O_conv = FALSE);
- X show_result(2);
- X
- X#ifdef TOX
- X clear_wline(BOT, ULEFT, RBOUND, 1, 1);
- X standout();
- X mvaddstr(BOT, ULEFT, Tk);
- X standend();
- X pfresh();
- X sleep(5);
- X move(CY, CX);
- X#endif
- X
- X TR_
- X}
- X
- SHAR_EOF
- $TOUCH -am 0221163890 interpret.c &&
- chmod 0644 interpret.c ||
- echo "restore of interpret.c failed"
- set `wc -c interpret.c`;Wc_c=$1
- if test "$Wc_c" != "23768"; then
- echo original size 23768, current size $Wc_c
- fi
- # ============= ledit.c ==============
- echo "x - extracting ledit.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > ledit.c &&
- X/* ledit.c */
- X/**********************************************************************
- X* File Name : ledit.c
- X* Function : line (window) editor of pac
- X* Author : Istvan Mohos, 1987
- X***********************************************************************/
- X
- X#include "defs.h"
- X
- Xledit(retbuf,Map,line_y,lbound,rbound,video,stripspace,intact)
- Xchar *retbuf, *Map;
- Xint line_y, lbound, rbound, video, stripspace, intact;
- X{
- X char c;
- X register int ri;
- X int rj;
- X int lchar, rchar;
- X int tbound, bbound;
- X int control = 1, retval = 0, first = 1;
- X int insert = 0;
- X char *rp;
- X static char *fid = "ledit";
- X
- X _TR
- X
- X if (line_y) {
- X CY = tbound = bbound = line_y;
- X CX = lbound;
- X }
- X else {
- X /* calculator window */
- X CY = tbound = UTOP;
- X bbound = UBOT;
- X CX = ULEFT;
- X }
- X
- X move(CY, CX);
- X pfresh();
- X
- X while(control) {
- X c = fgetc(stdin) & 127;
- X if (c == 10 || c == 13)
- X break;
- X if (c == 17 || c == 19)
- X continue;
- X if (!intact && first && c > 31) {
- X standout();
- X mvaddstr(MSG, MSGLEFT, Sp34); /* clear any error messages */
- X standend();
- X first = 0;
- X if (line_y)
- X clear_wline(tbound, lbound, rbound, video, 1);
- X else
- X clear_wline(UTOP, lbound, rbound, video, 3);
- X }
- X
- X if (video)
- X standout();
- X switch(*(Map+c)) {
- X
- X default: /* do nothing */
- X case 0:
- X break;
- X
- X case 1: /* exit */
- X go_away(ZERO, 0);
- X
- X case 2: /* addch */
- X if (insert) {
- X for (rj = bbound; rj >= CY + 1; rj--) {
- X for (ri = rbound; ri >= lbound + 1; ri--)
- X mvaddch(rj, ri, stdscr->_y[rj][ri - 1]);
- X mvaddch(rj, ri, stdscr->_y[rj - 1][rbound]);
- X }
- X for (ri = rbound; ri >= CX + 1; ri--)
- X mvaddch(CY, ri, stdscr->_y[CY][ri - 1]);
- X }
- X mvaddch(CY,CX,c);
- X if(++CX > rbound)
- X if (++CY <= bbound)
- X CX = lbound;
- X else {
- X --CY;
- X --CX;
- X }
- X move(CY,CX);
- X break;
- X
- X case 21: /* ignore to EOL */
- X while((c = fgetc(stdin) & 127) != 10 && c != 13);
- X ungetc(c, stdin);
- X break;
- X
- X case 3: /* move left */
- X if (--CX < lbound)
- X ++CX;
- X move(CY, CX);
- X break;
- X
- X case 4: /* move right */
- X if (++CX > rbound)
- X --CX;
- X move(CY, CX);
- X break;
- X
- X case 13: /* move up */
- X if (--CY < tbound)
- X ++CY;
- X move(CY, CX);
- X break;
- X
- X case 14: /* move down */
- X if (++CY > bbound)
- X --CY;
- X move(CY, CX);
- X break;
- X
- X case 15: /* move down and left */
- X if (++CY <= bbound)
- X CX = lbound;
- X else
- X --CY;
- X move(CY, CX);
- X break;
- X
- X case 7: /* clear; exit */
- X clearstack(0);
- X Amt = Rate = Years = 0.;
- X go_away("I", 0);
- X
- X case 8: /* wants parent to pop */
- X retval = 1;
- X control = 0;
- X break;
- X
- X case 9: /* wants parent to push */
- X retval = 2;
- X control = 0;
- X break;
- X
- X /* give back last c, read buffer */
- X case 12:
- X retval = c;
- X control = 0;
- X break;
- X
- X /* give back last c, skip buffer */
- X case 17:
- X pfresh();
- X TR_
- X return(c);
- X
- X case 10: /* fill to eol with spaces */
- X for (ri = CX; ri <= rbound; ri++)
- X addch(' ');
- X for (rj = tbound + 1; rj <= bbound; rj++) {
- X move(rj, lbound);
- X for (ri = CX; ri <= rbound; ri++)
- X addch(' ');
- X }
- X move(CY,CX);
- X break;
- X
- X /* curr line: delete char and move 1 pos to left */
- X case 11:
- X for (ri = CX + 1; ri <= rbound; ri++)
- X addch(stdscr->_y[CY][ri]);
- X addch(' ');
- X if (--CX < lbound)
- X ++CX;
- X move(CY,CX);
- X break;
- X
- X /* across lines: delete char and move 1 pos to left */
- X case 16:
- X for (ri = CX + 1; ri <= rbound; ri++)
- X addch(stdscr->_y[CY][ri]);
- X for (rj = CY + 1; rj <= bbound; rj++) {
- X addch(stdscr->_y[rj][lbound]);
- X move(rj, lbound);
- X for (ri = lbound + 1; ri <= rbound; ri++)
- X addch(stdscr->_y[rj][ri]);
- X }
- X addch(' ');
- X if (--CX < lbound)
- X ++CX;
- X move(CY,CX);
- X break;
- X
- X case 18 :
- X clearok(curscr, TRUE);
- X break; /* ^R redraw */
- X
- X case 19 :
- X insert = 1;
- X break;
- X
- X case 20 :
- X insert = 0;
- X break;
- X }
- X standend();
- X pfresh();
- X }
- X
- X rp = retbuf;
- X if (stripspace) { /* single line implementation only */
- X /* find first non-space from the left */
- X for (ri = lbound; ri <= rbound; ri++)
- X if ((stdscr->_y[CY][ri] & 127) > 32)
- X break;
- X if ((lchar = ri) > rbound) {
- X *rp = '\0';
- X pfresh();
- X TR_
- X return(retval);
- X }
- X
- X /* find first non-space from the right */
- X for (ri = rbound; ri >= lbound; ri--)
- X if ((stdscr->_y[CY][ri] & 127) > 32)
- X break;
- X rchar = ri;
- X
- X /* give back everything in between */
- X for (ri = lchar; ri <= rchar; ri++)
- X *rp++ = stdscr->_y[CY][ri] & 127;
- X }
- X else
- X for (rj = tbound; rj <= bbound; rj++)
- X for (ri = lbound; ri <= rbound; ri++)
- X *rp++ = stdscr->_y[rj][ri] & 127;
- X *rp = '\0';
- X pfresh();
- X
- X if (Trace && Tf != NULL)
- X fprintf(Tf, "[%s]\n", retbuf);
- X TR_
- X return(retval);
- X}
- X
- SHAR_EOF
- $TOUCH -am 0221163890 ledit.c &&
- chmod 0644 ledit.c ||
- echo "restore of ledit.c failed"
- set `wc -c ledit.c`;Wc_c=$1
- if test "$Wc_c" != "6967"; then
- echo original size 6967, current size $Wc_c
- fi
- # ============= onlay.c ==============
- echo "x - extracting onlay.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > onlay.c &&
- X/* onlay.c */
- X/**********************************************************************
- X* File Name : onlay.c
- X* Function : draw initial pac screen
- X* Author : Istvan Mohos, 1987
- X***********************************************************************/
- X
- X#define SO standout()
- X#define SE standend()
- X#define uw 48
- X#define re 78
- X#define se 58
- X#define sp " "
- X
- X#include "defs.h"
- X
- Xonlay()
- X{
- X register int i = TOP + 1, j = LBOUND;
- X static char *fid = "onlay";
- X
- X _TR
- X mvaddstr(UTOP, ATOIX, "^A asc");
- X mvaddstr(UTOP + 1, ATOIX, "^D dec");
- X mvaddstr(UTOP + 2, ATOIX, "^O oct");
- X mvaddstr(UTOP + 3, ATOIX, "^X hex");
- X
- X SO;
- X mvaddstr(TOP, j, " ");
- X mvaddstr(TOP, ULEFT, Titlq[0]);
- X SE;SO;
- X mvaddstr(i,j,sp);mvaddstr(i,uw,sp);mvaddstr(i,se,sp);mvaddstr(i++,re,sp);SE;SO;
- X mvaddstr(i,j,sp);mvaddstr(i,uw,sp);mvaddstr(i,se,sp);mvaddstr(i++,re,sp);SE;SO;
- X mvaddstr(i,j,sp);mvaddstr(i,uw,sp);mvaddstr(i,se,sp);mvaddstr(i++,re,sp);SE;SO;
- X mvaddstr(i,j,sp);mvaddstr(i,uw,sp);mvaddstr(i,se,sp);mvaddstr(i++,re,sp);SE;SO;
- X mvaddstr(i,j, " LOAN ");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);SE;SO;
- X
- X SO; mvaddstr(STATY - 1, STATMSG - 1, " GLOBALS "); SE;
- X
- X i = STACKTOP;
- X SO;
- X mvaddstr(i,j,"h");SE;addstr(" 0");SO;mvaddstr(i,40,"amt");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i,j,"i");SE;addstr(" 0");SO;mvaddstr(i,40," % ");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i,j,"j");SE;addstr(" 0");SO;mvaddstr(i,40,"yrs");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i,j,"k");SE;addstr(" 0");SO;mvaddstr(i,40,"pay");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i,j,"l");SE;addstr(" 0");SO;mvaddstr(i,40,"^B ");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i,j,"m");SE;addstr(" 0");SO;mvaddstr(i,40," ");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i,j,"n");SE;addstr(" 0");SO;mvaddstr(i,40,"[le");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i,j,"o");SE;addstr(" 0");SO;mvaddstr(i,40,"]ri");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i,j,"p");SE;addstr(" 0");SO;mvaddstr(i,40,"{up");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i,j,"q");SE;addstr(" 0");SO;mvaddstr(i,40,"}dn");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i,j,"r");SE;addstr(" 0");SO;mvaddstr(i,40,"|cr");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i,j,"s");SE;addstr(" 0");SO;mvaddstr(i,40,"^Cl");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i,j,"t");SE;addstr(" 0");SO;mvaddstr(i,40," BS");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i,j,"u");SE;addstr(" 0");SO;mvaddstr(i,40,"DEL");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i,j,"v");SE;addstr(" 0");SO;mvaddstr(i,40,">im");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i,j,"w");SE;addstr(" 0");SO;mvaddstr(i,40,"<ei");
- X mvaddstr(i,se,sp);mvaddstr(i++,re,sp);
- X mvaddstr(i, j, " ");
- X mvaddstr(i, ULEFT, Basq[0]); SE;
- XTR_
- X}
- X
- Xupdate()
- X{
- X register int ri;
- X int pyp, pxp;
- X static char *fid = "update";
- X
- X _TR
- X CYX;
- X for (ri = TREQ; --ri >= 0;) {
- X if (Titlq[ri] != ZERO) {
- X standout();
- X mvaddstr(TOP, ULEFT, Titlq[ri]);
- X break;
- X }
- X }
- X
- X for (ri = BREQ; --ri >= 0;) {
- X if (Basq[ri] != ZERO) {
- X mvaddstr(BOT, ULEFT, Basq[ri]);
- X standend();
- X break;
- X }
- X }
- X
- X PYX;
- XTR_
- X}
- SHAR_EOF
- $TOUCH -am 0221163890 onlay.c &&
- chmod 0644 onlay.c ||
- echo "restore of onlay.c failed"
- set `wc -c onlay.c`;Wc_c=$1
- if test "$Wc_c" != "3586"; then
- echo original size 3586, current size $Wc_c
- fi
- echo "End of part 4, continue with part 5"
- exit 0
-
-
-