0707070000020017161006440001460001440000010626470365146141100000500000000004Size290 0707070000020056601006440001460001440000010550350364233260200000700000015330Axes.c#include #include #include #include "mongo.h" #define fabs(x) ((x < 0) ? -x: x) /* draw the axes of the graph: if arguments are given, use them to scale the axes, otherwise, figure out appropriate scales */ draw_axes(cmd_buf) char *cmd_buf; { char dummy[10]; double dx, dy; INT16 p[2], new_style, old_style; double get_units (); wselect(graph_w); /* draw a box around the graph */ box(); /* set line style to solid and save old line style */ new_style = SOLID; vql_attributes(dev_crt, p); old_style = p[0]; vsl_type(dev_crt, new_style); /* read scale interval from the command line */ if (sscanf (cmd_buf, "%s %lf %lf", dummy, &dx, &dy) != 3) { /* since no intervals are given, determine suitable intervals */ dx = get_units(maxx, minx, 8); dy = get_units(maxy, miny, 8); } xaxis(dx); yaxis(dy); /* restore default text justification and restore old line style */ vst_alignment(dev_crt, 0, 0, &p[0], &p[1]); vsl_type(dev_crt, old_style); #ifdef PRINTER if (PRINT) { pr_box(); vsl_type(dev_prt, new_style); pr_xaxis(dx); pr_yaxis(dy); vst_alignment(dev_prt, 0, 0, &p[0], &p[1]); vsl_type(dev_prt, old_style); } #endif } /* draw the hash marks on the x axis and label them; also put the scaling factor if there is one */ xaxis(dx) double dx; { char dummy[10]; double x1, x, ndcx, ndcy; int imax, i; double fmax; INT16 p[4]; /* find the position of the first marker on the x axis */ x1 = ((int)(minx / dx)) * dx; if (x1 < minx) x1 += dx; if (fabs(maxx) > fabs(x1)) f_to_e(maxx, &fmax, &imax); else f_to_e(x1, &fmax, &imax); /* draw hash marks and label them */ vst_alignment(dev_crt, 1, 2, &p[0], &p[1]); p[1] = MINY + 150; p[3] = MINY - 150; for (x = x1; x <= maxx; x += dx) { world_to_ndc(x, miny, &ndcx, &ndcy); p[0] = ndcx; p[2] = ndcx; v_pline(dev_crt, (INT16) 2, p); f_to_e(x, &x1, &i); if (i < imax) for (; i < imax; i++) x1 /= 10; sprintf(dummy, "%-4.2lf", x1); v_gtext(dev_crt, p[0], p[3], dummy); } /* print scaling factor, if there is one */ if (imax != 0) { /* left and top justify text */ vst_alignment(dev_crt, 0, 2, &p[0], &p[1]); p[0] = MAXX - 8 * T_WIDTH; p[3] -= 2 * T_HEIGHT; v_gtext(dev_crt, p[0], p[3], "X 10"); if (imax != 1) { sprintf(dummy, "%-5d", imax); p[0] += 4 * T_WIDTH; p[3] += T_HEIGHT / 2; v_gtext(dev_crt, p[0], p[3], dummy); } } } /* draw hash marks on the y axis and label them; also put the scaling factor if there is one */ yaxis(dy) double dy; { char dummy[10]; double y1, y, ndcx, ndcy; int imax, i; double fmax; INT16 p[4]; /* find the position of the first marker on the y axis */ y1 = ((int)(miny / dy)) * dy; if (y1 < miny) y1 += dy; if (fabs(maxy) > fabs(y1)) f_to_e(maxy, &fmax, &imax); else f_to_e(y1, &fmax, &imax); /* put hash marks and label them */ vst_alignment(dev_crt, 2, 1, &p[0], &p[1]); p[0] = MINX - 150; p[2] = MINX + 150; for (y = y1; y <= maxy; y += dy) { world_to_ndc(minx, y, &ndcx, &ndcy); p[1] = ndcy; p[3] = ndcy; v_pline(dev_crt, (INT16) 2, p); f_to_e(y, &y1, &i); if (i < imax) for (; i < imax; i++) y1 /= 10; sprintf(dummy, "%-4.2lf", y1); v_gtext(dev_crt, p[0], p[1], dummy); } /* print scaling factor, if there is one */ if (imax != 0) { /* right and bottom justify text */ vst_alignment(dev_crt, 2, 0, &p[0], &p[1]); sprintf(dummy, "X 10"); p[0] = MINX - 3 * T_WIDTH; p[1] = MAXY; v_gtext(dev_crt, p[0], p[1], dummy); if (imax != 1) { sprintf(dummy, "%-3d", imax); p[0] = MINX; p[1] += T_WIDTH / 2; v_gtext(dev_crt, p[0], p[1], dummy); } } } /* find suitable intervals for scaling, given the max and min of the scale and the number of intervals desired */ double get_units(max, min, n) double max, min; int n; { double dx, x; int i, j, xint; double e_to_f (); dx = (max - min) / n; /* convert dx to scientific notation */ f_to_e (dx, &x, &i); /* pick a somewhat neat interval for x so that the scale looks nice */ switch (xint = x) { case 3: case 4: case 6: case 7: { x = 5; break; } case 8: case 9: { x = 10; break; } default: { x = xint; break; } } /* convert scientific notation to decimal */ dx = e_to_f (x, i); return (dx); } /* label x axis */ xlabel(cmd_buf) char *cmd_buf; { INT16 px, py; char *p; wselect(graph_w); /* skip over the word "xaxis" and any blank space to get to the label */ for (p = cmd_buf + 5; (isspace(*p)); p++) ; /* if no text, just return */ if (*p == '\0') return; /* position text and print */ vst_alignment(dev_crt, 1, 2, &px, &py); px = MINX + (MAXX - MINX) / 2; py = MINY - 2 * T_HEIGHT; v_gtext(dev_crt, px, py, p); /* set text justification back to default */ vst_alignment(dev_crt, 0, 0, &px, &py); #ifdef PRINTER if (PRINT) { /* do same to printer */ vst_alignment(dev_prt, 1, 2, &px, &py); px = PR_MINX + (PR_MAXX - PR_MINX) / 2; py = PR_MINY - 2 * PR_T_HEIGHT; v_gtext(dev_prt, px, py, p); vst_alignment(dev_prt, 0, 0, &px, &py); } #endif } /* label y axis */ ylabel(cmd_buf) char *cmd_buf; { INT16 px, py; char *p; wselect(graph_w); /* skip over the word "yaxis" and any blank space to get to the label */ for (p = cmd_buf + 5; (isspace(*p)); p++) ; /* if no text, just return */ if (*p == '\0') return; /* rotate the text baseline; set justification to bottom center */ vst_rotation(dev_crt, 900); vst_alignment(dev_crt, 1, 0, &px, &py); /* print text */ px = MINX - 6 * T_WIDTH; py = MINY + (MAXY - MINY) / 2; v_gtext(dev_crt, px, py, p); /* put text settings back to default */ vst_rotation(dev_crt, 0); vst_alignment(dev_crt, 0, 0, &px, &py); #ifdef PRINTER if (PRINT) { /* do same thing to printer */ vst_rotation(dev_prt, 900); vst_alignment(dev_prt, 1, 0, &px, &py); px = PR_MINX - 6 * PR_T_WIDTH; py = PR_MINY + (PR_MAXY - PR_MINY) / 2; v_gtext(dev_prt, px, py, p); vst_rotation(dev_prt, 0); vst_alignment(dev_prt, 0, 0, &px, &py); } #endif } /* put a title on the graph */ title(cmd_buf) char *cmd_buf; { INT16 px, py; char *p; wselect(graph_w); /* skip over the word "title" and any blank space to get to the label */ for (p = cmd_buf + 5; (isspace(*p)); p++) ; /* if no text, just return */ if (*p == '\0') return; /* print text */ vst_alignment(dev_crt, 1, 2, &px, &py); px = MINX + (MAXX - MINX) / 2; py = MAXY + T_HEIGHT; v_gtext(dev_crt, px, py, p); /* set text justification back to default */ vst_alignment(dev_crt, 0, 0, &px, &py); #ifdef PRINTER if (PRINT) { /* do same thing to printer */ vst_alignment(dev_prt, 1, 2, &px, &py); px = PR_MINX + (PR_MAXX - PR_MINX) / 2; py = PR_MAXY + PR_T_HEIGHT; v_gtext(dev_prt, px, py, p); vst_alignment(dev_prt, 0, 0, &px, &py); } #endif } 0707070000020057011006440001460001440000010550400364233260200001000000001350Fecvt.c#include #define fabs(x) ((x < 0) ? -x: x) /* convert a floating point to frac * 10 ^ ex format */ f_to_e (f, frac, ex) double f, *frac; int *ex; { int sign, i; if (f == 0) { *frac = 0; *ex = 0; return; } /* determine the sign and save it for later */ if (f < 0) sign = -1; else sign = 1; /* convert to exponential notation */ f = fabs(f); if (f < 1) for (i = 0; f < 1; i--) f *= 10; else for (i = 0; f > 10; i++) f /= 10; *frac = sign * f; *ex = i; } /* convert base 10 exponential notation to floating point */ double e_to_f (x, ex) double x; int ex; { if (x == 0) return (0); if (ex > 0) for (; ex > 0; ex--) x *= 10; else for (; ex < 0; ex++) x /= 10; return (x); } 0707070000020057451006440001460001440000010550220365146135700000600000000266Files./Size ./Axes.c ./Fecvt.c ./Files ./Hash.c ./Input.c ./Install ./Ioctl.c ./MAKEcpio ./Makefile ./Mongo.c ./Name ./Output.c ./Printer.c ./Remove ./mongo ./mongo.h ./README ./testdata 0707070000020057461006440001460001440000010550230365145350300000700000002643Hash.c#include "mongo.h" #define HASHSIZE 100 static struct nlist *hashtab[HASHSIZE]; /* fill the hashtable with NULL's */ table_init() { int i; for (i = 0; i < HASHSIZE; i++) hashtab[i] = NULL; } /* form a hash value */ hash(s) char *s; { int hashval; for (hashval = 0; *s != '\0'; ) hashval += *s++; return(hashval % HASHSIZE); } /* return a pointer to the struct containing the string s in the table, or NULL if none is found. */ struct nlist * lookup(s) char *s; { struct nlist *np; int i; if ((i = hash(s)) < 0) return(NULL); for (np = hashtab[i]; np != NULL; np = np->next) if (strcmp(s, np->name) == 0) return(np); return(NULL); } /* install a new entry into the hash table, or return NULL if there is no more room */ struct nlist * install(name, func) char *name; PFI func; { struct nlist *np, *lookup(); char *malloc(), *strsave(); int hashval; if ((np = lookup(name)) == NULL) { np = (struct nlist *) malloc (sizeof(struct nlist)); if (np == NULL) return(NULL); if ((np->name = strsave(name)) == NULL) return(NULL); hashval = hash(name); np->next = hashtab[hashval]; hashtab[hashval] = np; } np->func = func; return(np); } /* return a pointer to a copy of the given string, or NULL if there is no more free memory */ char * strsave(s) char *s; { char *p, *malloc(); if ((p = malloc(strlen(s))) == NULL) return(NULL); strcpy(p, s); return(p); } 0707070000020057511006440001460001440000010550250364233260300001000000011220Input.c#include #include #include #include "mongo.h" /* open the given file, setting 'fp' to its file pointer */ get_file(cmd_buf) char *cmd_buf; { char filename[20], dummy[10]; sscanf(cmd_buf, "%s %s", dummy, filename); if ((fp = fopen(filename, "r")) == NULL) { wprintf(text_w, "cannot open file %s\n", filename); } } /* grab the x data from the given column */ get_xc(cmd_buf) char *cmd_buf; { int i, j, c1, c2; char c[10]; char buf[BUFSIZ]; char dummy[MAX_COLUMN][10]; if (fp == NULL) { wprintf(text_w, "no file open\n"); return; } if (sscanf(cmd_buf, "%s %d", c, &c1) < 2) { wprintf(text_w, "%d\n", xc); return; } else if ((c1 < 1) || (c1 > MAX_COLUMN)) { wprintf(text_w, "%d: invalid column number\n", c1); return; } xc = c1; fseek(fp, (long) 0, 0); i = 0; while ((fgets(buf, BUFSIZ, fp) != NULL) && (i < AR_SIZE)) { for (j = 0; j < MAX_COLUMN; j++) dummy[j][0] = '\0'; if (sscanf(buf, "%s %s %s %s %s %s %s %s %s %s", dummy[0], dummy[1], dummy[2], dummy[3], dummy[4], dummy[5], dummy[6], dummy[7], dummy[8], dummy[9]) < xc) wprintf(text_w, "inconsistent data on line %d\n", i + 1); if (sscanf(dummy[xc - 1], "%lf", &file_x[i]) < 1) wprintf(text_w, "inconsistent data on line %d\n", i + 1); if (++i >= AR_SIZE) break; } num_read = i; } /* grab the y data from the given column */ get_yc(cmd_buf) char *cmd_buf; { int i, j, c1, c2; char c[10]; char buf[BUFSIZ]; char dummy[MAX_COLUMN][10]; if (fp == NULL) { wprintf(text_w, "no file open\n"); return; } if (sscanf(cmd_buf, "%s %d", c, &c1) < 2) { wprintf(text_w, "%d\n", yc); return; } else if ((c1 < 1) || (c1 > MAX_COLUMN)) { wprintf(text_w, "%d: invalid column number\n", c1); return; } yc = c1; fseek(fp, (long) 0, 0); i = 0; while ((fgets(buf, BUFSIZ, fp) != NULL) && (i < AR_SIZE)) { for (j = 0; j < MAX_COLUMN; j++) dummy[j][0] = '\0'; if (sscanf(buf, "%s %s %s %s %s %s %s %s %s %s", dummy[0], dummy[1], dummy[2], dummy[3], dummy[4], dummy[5], dummy[6], dummy[7], dummy[8], dummy[9]) < yc) wprintf(text_w, "inconsistent data on line %d\n", i + 1); if (sscanf(dummy[yc - 1], "%lf", &file_y[i]) < 1) wprintf(text_w, "inconsistent data on line %d\n", i + 1); if (++i >= AR_SIZE) break; } num_read = i; } /* get the limits for the plot - if called without arguments, set limits by the extremes of the data points. put the limits into the variables: minx, maxx, miny, maxy in that order. */ get_limits(cmd_buf) char *cmd_buf; { char dummy[10]; int i; double diff; if (sscanf(cmd_buf, "%s %lf %lf %lf %lf", dummy, &minx, &maxx, &miny, &maxy) < 5) { maxx = minx = file_x[0]; maxy = miny = file_y[0]; for (i = low_line - 1; (i < num_read) && (i < high_line - 1); i++) { if (file_x[i] > maxx) maxx = file_x[i]; if (file_x[i] < minx) minx = file_x[i]; if (file_y[i] > maxy) maxy = file_y[i]; if (file_y[i] < miny) miny = file_y[i]; } diff = (maxx - minx) / 20; maxx += diff; minx -= diff; diff = (maxy - miny) / 20; maxy += diff; miny -= diff; } } /* use only data from between the given two lines in plotting and so forth */ lines(cmd_buf) char *cmd_buf; { char dummy[10]; int num, l, h; if ((num = sscanf(cmd_buf, "%s %d %d", dummy, &l, &h)) == 1) { wprintf(text_w, "%d %d\n", low_line, high_line); } else if (num < 3) { wprintf(text_w, "usage: lines low high\n"); } else { if ((l >= 1) && (l < AR_SIZE)) low_line = l; if ((h >= 1) && (h < AR_SIZE)) high_line = h; } } /* get a string from a text window up to, but not including, a newline */ wgets(wn, str) short wn; char *str; { char *s = str; int c; while (((c = *s++ = wgetc(wn)) != LF) && (c != CR)) wputc(wn, c); wputc(wn, LF); *(s-1) = '\0'; fix_text(str); } /* convert all the backspace characters in the given string into actual deletions in the text, so that limirts becomes the proper limits */ fix_text(str) char *str; { int i; static char new[100], *p, *q; for (q = new, p = str; (*q = *p) != '\0'; p++, q++) if (*p == BACKSPACE) q -= 2; strcpy(str, new); } /* if given two arguments, move the text position to the given place in file (not NDC) coordinates. if given no arguments, print the current text position. if given one, print an error message. */ position(cmd_buf) char *cmd_buf; { int num; char dummy[10]; double px, py; if ((num = sscanf(cmd_buf, "%s %lf %lf", dummy, &px, &py)) == 1) { wprintf(text_w, "%lf %lf\n", x_text_pos, y_text_pos); } else if (num >= 3) { x_text_pos = px; y_text_pos = py; } else { wprintf(text_w, "usage: position x_pos y_pos\n"); } } 0707070000020057521007550001460001440000010650750365147330500001000000003775Install# shell script for installing mongo NAME=MONGO FOLDER=/u/$LOGNAME/Filecabinet/SRC SOURCE="Axes.c Fecvt.c Hash.c Input.c Ioctl.c Mongo.c Output.c Printer.c" MISC="Makefile README mongo.h testdata" if [ ! -s /usr/lib/GSS_Drivers/Environment ] then message "WARNING: MONGO WILL NOT WORK UNTIL YOU INSTALL THE GSS DRIVERS INSTALLATION SET THAT CAME WITH YOUR FOUNDATION SET.\n\nTHIS INSTALLATION WILL ABORT - PLEASE REINSTALL AFTER YOU INSTALL THE DRIVERS." exit 1 else if [ ! "$DISPLAY" ] then cat >> /etc/localprofile < to continue ..." fi fi echo "\n\n\nDo you want the C source code for MONGO? (y or n) \c" read ANS case "$ANS" in y*|Y*) ANS=1 ;; *) ANS="" ;; esac if [ -d $FOLDER ] then message -i "A new folder called $NAME will be created in your Filecabinet/SRC folder. All information will be placed in this folder for your use.\n\nTouch to continue." else message -i "A folder called SRC is being created in your Filecabinet. A second folder called SRC/$NAME will then be created to hold all information for your use.\n\nTouch to continue." mkdir $FOLDER chown $LOGNAME $FOLDER fi mkdir ${FOLDER}/$NAME chown $LOGNAME ${FOLDER}/$NAME DEST=${FOLDER}/$NAME for i in ${MISC} do ln $i ${DEST}/$i chown $LOGNAME ${DEST}/$i chmod 644 ${DEST}/$i done if [ $ANS ] then for i in ${SOURCE} do ln $i ${DEST}/$i chown $LOGNAME ${DEST}/$i chmod 644 ${DEST}/$i done fi ln mongo /usr/bin/mongo ln /usr/bin/mongo ${FOLDER}/${NAME}/mongo chmod 755 /usr/bin/mongo message -i "The executable is in /usr/bin.\n\nDocumentation and all other information is in Filecabinet/SRC/${NAME}.\n\nTouch to continue." message -i "A manual page with the description of commands is also placed in Filecabinet/SRC/${NAME}/README.\n\nTouch to continue." 0707070000020057541006440001460001440000010644130364233260400001000000001036Ioctl.c#include extern short text_w, graph_w; reverse() { struct urdata ur; struct uwdata uw; int i, j, k; unsigned short pat[16]; ioctl(graph_w, WIOCGETD, &uw); ur.ur_height = uw.uw_height; ur.ur_width = uw.uw_width; for (i = 0; i < 16; i++) pat[i] = 65535; ur.ur_srcbase = 0; ur.ur_srcwidth = 0; ur.ur_dstbase = 0; ur.ur_dstwidth = 0; ur.ur_srcx = 0; ur.ur_srcy = 0; ur.ur_dstx = 0; ur.ur_dsty = 0; ur.ur_srcop = SRCXOR; ur.ur_dstop = DSTSRC; ur.ur_pattern = pat; ioctl(graph_w, WIOCRASTOP, &ur); } 0707070000020057571007770001460001440000010650740364403056000001100000000042MAKEcpiocat Files | cpio -ocBv > MONGO+IN 0707070000020057611006440001460001440000010645720432721740200001100000000452Makefileinclude $(MAKEINC)/Makepre.h HDR = mongo.h OBJ = Axes.o Fecvt.o Hash.o Input.o Ioctl.o Mongo.o Output.o Printer.o CFLAGS = -Dm68k -Dm68 -Dmc68k -Uvax -UMICROOMS -Updp11 -Uu3b $(LCFLAGS) $(OLCFLAGS) -I$(I) -O -DPRINTER mongo: $(HDR) $(OBJ) $(LD) -G $(LDFLAGS) $(SHAREDLIB) $(OBJ) -lcvdi -o mongo 0707070000020057621006440001460001440000010646010364233260400001000000013327Mongo.c#include #include #include #include "mongo.h" INT16 display[] = { 1, /* equal axis ratios */ 1, /* solid line type */ 1, /* line color index to use - white */ 3, /* marker type - star */ 1, /* marker color index - white */ 1, /* text font to use - normal */ 1, /* text color - white */ 0, /* fill interior style - hollow */ 0, /* fill style index - plain */ 1, /* fill color index - white */ 1, /* send device messages to screen */ 'D', 'I', 'S', 'P', 'L', 'A', 'Y', ' ' /* device name */ }; char *line_type[] = { "SOLID", "LONG_DASH", "DOT", "DASH_DOT", "MEDIUM_DASH", "DASH_2_DOTS" }; char *point_type[] = { "POINT", "PLUS", "ASTERISK", "CIRCLE", "CROSS", "DIAMOND" }; main(argc, argv) int argc; char *argv[]; { int i, j, k, num1, num2; char *gets(), cmd_buf[50], command[10]; struct nlist *lookup(), *np; init(); while (1) { command[0] = '\0'; wselect (text_w); wprintf(text_w, "> "); wgets(text_w, cmd_buf); sscanf(cmd_buf, "%s", command); if ((np = lookup(command)) == NULL) { wprintf(text_w, "%s ?\n", command); continue; } (*(np->func))(cmd_buf); } } /* set up two windows, one for the graphics, one for text and stuff. select the text one, so that it is on top */ init() { short placex = 1; short placey = 0; short height, width; unsigned short flags; struct utdata utd; struct nlist *install(); INT16 dev_info[66], text_attrib[10], err_report; int my_clear(), get_file(), get_xc(), get_yc(), get_limits(); int points(), connect(), box(), quit(), ltype(), ptype(); int lines(), position(), label(), reverse(); int draw_axes(), xlabel(), ylabel(), title(); #ifdef PRINTER int my_update(); int init_print(), end_print(), my_print(); #endif winit(); /* create the graphics window */ height = 24; width = 80; flags = NBORDER; graph_w = wcreate(placex, placey, height, width, flags); utd.ut_num = WTXTLABEL; strcpy(utd.ut_text, "Mongo Graph"); ioctl(graph_w, WIOCSETTEXT, &utd); /* create the text window */ height = 4; width = 30; flags = BORDRESIZE; text_w = wcreate(placex, placey, height, width, flags); utd.ut_num = WTXTLABEL; strcpy(utd.ut_text, "Mongo Commands"); ioctl(text_w, WIOCSETTEXT, &utd); /* open graphics workstation */ wselect(graph_w); err_report = v_opnwk(display, &dev_crt, dev_info); if (err_report != 0) { wselect(text_w); wprintf(text_w,"error opening screen: %d\n", vq_error()); wexit(); } /* set graph borders and text borders */ vqt_attributes(dev_crt, text_attrib); T_HEIGHT = text_attrib[9]; T_WIDTH = text_attrib[8]; MINX = 8 * T_WIDTH; MAXX = dev_info[51] - T_WIDTH; MINY = 4 * T_HEIGHT; MAXY = dev_info[52] - 2 * T_HEIGHT; /* set some characteristics of the graphics window */ cur_p_type = PLUS; cur_l_type = DOT; vsm_type(dev_crt, cur_p_type); /* plus signs as points */ vsl_type(dev_crt, cur_l_type); /* dotted line */ /* set a few other things */ low_line = 1; high_line = AR_SIZE; /* initialize printer and plotter flags */ PRINT = 0; PLOT = 0; /* install commands in the command table */ table_init(); install("clear", my_clear); install("file", get_file); install("xc", get_xc); install("yc", get_yc); install("lines", lines); install("limits", get_limits); install("ltype", ltype); install("ptype", ptype); install("points", points); install("connect", connect); install("box", box); install("position", position); install("label", label); install("reverse", reverse); install("quit", quit); install("axes", draw_axes); install("xaxis", xlabel); install("yaxis", ylabel); install("title", title); #ifdef PRINTER install("update", my_update); install("dump", my_print); install("printer", init_print); install("noprinter", end_print); #endif } /* in the second two arguments, put the NDC coordinates corresponding to the world coordinates given in the first two arguments */ world_to_ndc(wx, wy, nx, ny) double wx, wy, *nx, *ny; { double fx, fy, cx, cy; fx = (MAXX - MINX) / (maxx - minx); fy = (MAXY - MINY) / (maxy - miny); cx = MINX - fx * minx; cy = MINY - fy * miny; *nx = wx * fx + cx; *ny = wy * fy + cy; } /* set the type of line used in connect(); with no arguments, prints the current type */ ltype(cmd_buf) char *cmd_buf; { int i; char dummy[7], type[20]; if (sscanf(cmd_buf, "%s %s", dummy, type) < 2) wprintf(text_w, "%s\n", line_type[cur_l_type - 1]); else { for (i = 0; i <= (MAX_L_TYPE - MIN_L_TYPE); i++) if (strcmp(type, line_type[i]) == 0) { cur_l_type = i + MIN_L_TYPE; vsl_type(dev_crt, cur_l_type); #ifdef PRINTER if (PRINT) vsl_type(dev_prt, cur_l_type); #endif } } } /* set the type of point used in points(); with no arguments, prints the current type */ ptype(cmd_buf) char *cmd_buf; { int i; char dummy[7], type[20]; if (sscanf(cmd_buf, "%s %s", dummy, type) < 2) wprintf(text_w, "%s\n", point_type[cur_p_type - 1]); else { for (i = 0; i <= (MAX_P_TYPE - MIN_P_TYPE); i++) if (strcmp(type, point_type[i]) == 0) { cur_p_type = i + MIN_P_TYPE; vsm_type(dev_crt, cur_p_type); #ifdef PRINTER if (PRINT) vsm_type(dev_prt, cur_p_type); #endif } } } /* clear the graphics window and the printer, if appropriate */ my_clear() { wselect (graph_w); v_clrwk(dev_crt); #ifdef PRINTER if (PRINT) v_clrwk(dev_prt); #endif } /* make a hard copy */ #ifdef PRINTER my_print () { int err; wselect(graph_w); err = v_hardcopy(dev_crt); if (err != 0) { wselect(text_w); wprintf(text_w, "error hardcopy\n"); } } #endif /* update printer workstation */ #ifdef PRINTER my_update() { if (PRINT) v_updwk(dev_prt); } #endif /* quit */ quit() { wselect(graph_w); v_clrwk(dev_crt); v_clswk(dev_crt); #ifdef PRINTER if (PRINT) v_clswk(dev_prt); #endif wexit(); } 0707070000020057631006440001460001440000010551270365145356600000500000000105NameMONGO - 04/17/86 - An interactive graphics program - from THE STORE! 0707070000020057641006440001460001440000010551300364233260500001100000007150Output.c#include #include #include #include "mongo.h" /* translate the file_x[] and file_y[] arrays into x[] and y[] arrays in NDC space, but don't round to integers in preparation for display yet - do that later so that we don't "wrap around" on the screen due to overflow. */ normalize() { double fx, fy, cx, cy; int i; fx = (MAXX - MINX) / (maxx - minx); fy = (MAXY - MINY) / (maxy - miny); cx = MINX - fx * minx; cy = MINY - fy * miny; for (i = 0; i < num_read; i++) { x[i] = file_x[i] * fx + cx; y[i] = file_y[i] * fy + cy; } } /* return 1 if the given point is inside the window, 0 otherwise */ inside(x, y) double x, y; { if ((x < MINX) || (x > MAXX) || (y < MINY) || (y > MAXY)) return(0); return(1); } /* put a point at each data point */ points() { int i; double *px, *py; INT16 xy[2]; wselect(graph_w); normalize(); for (i = low_line - 1, px = x, py = y; (i < num_read) && (i < high_line - 1); i++, px++, py++) { if (inside(*px, *py)) { xy[0] = *px; xy[1] = *py; v_pmarker(dev_crt, 1, xy); } } #ifdef PRINTER if (PRINT) pr_points(); #endif } /* connect the dots */ connect() { int i; wselect(graph_w); normalize(); for (i = low_line - 1; (i < high_line - 1) && (i < num_read - 1); i++) clip_n_draw(x[i], y[i], x[i+1], y[i+1]); #ifdef PRINTER if (PRINT) pr_connect(); #endif } /* draw a box around the graphics window area */ box() { INT16 corner[10]; INT16 old_style, new_style; wselect(graph_w); new_style = SOLID; /* solid line */ vql_attributes(dev_crt, corner); old_style = corner[0]; corner[0] = MINX; corner[1] = MINY; corner[2] = MAXX; corner[3] = MINY; corner[4] = MAXX; corner[5] = MAXY; corner[6] = MINX; corner[7] = MAXY; corner[8] = MINX; corner[9] = MINY; vsl_type(dev_crt, new_style); v_pline(dev_crt, (INT16) 5, corner); vsl_type(dev_crt, old_style); #ifdef PRINTER if (PRINT) pr_box(); #endif } /* place the given string at the current text position - if it is off-screen, do nothing and let him figure it out. */ label(cmd_buf) char *cmd_buf; { double dx, dy; INT16 px, py; char *p; wselect(graph_w); /* skip over the word "label" and any blank space to get to the text of the command */ for (p = cmd_buf + 5; (isspace(*p)); p++) ; /* if no text, just return */ if (*p == '\0') return; world_to_ndc(x_text_pos, y_text_pos, &dx, &dy); if (inside(dx, dy)) v_gtext(dev_crt, (px = dx), (py = dy), p); #ifdef PRINTER if (PRINT) { pr_world_to_ndc(x_text_pos, y_text_pos, &dx, &dy); if (pr_inside(dx, dy)) v_gtext(dev_prt, (px = dx), (py = dy), p); } #endif } code(x, y) double x, y; { return(((y > MAXY) << 3) | ((y < MINY) << 2) | ((x > MAXX) << 1) | ((x < MINX))); } #define SWAP t = x1; u = y1; x1 = x2; y1 = y2; x2 = t; y2 = u; code1 = code2; clip_n_draw(x1, y1, x2, y2) double x1, y1, x2, y2; { double t, u; INT16 xy[4]; int code1, code2; while (1) { code1 = code(x1, y1); code2 = code(x2, y2); if (!(code1 | code2)) { xy[0] = x1; xy[1] = y1; xy[2] = x2; xy[3] = y2; v_pline(dev_crt, 2, xy); return; } else if (code1 & code2) return; else { /* first, make sure that point 1 is outside the window */ if (!code1) { SWAP } if (code1 & 8) { x1 += (x2 - x1) * (MAXY - y1) / (y2 - y1); y1 = MAXY; } else if (code1 & 4) { x1 += (x2 - x1) * (MINY - y1) / (y2 - y1); y1 = MINY; } else if (code1 & 2) { y1 += (y2 - y1) * (MAXX - x1) / (x2 - x1); x1 = MAXX; } else if (code1 & 1) { y1 += (y2 - y1) * (MINX - x1) / (x2 - x1); x1 = MINX; } } } } 0707070000020057651006440001460001440000010556340364233260600001200000015757Printer.c/* * This file contains printer related functions. * Compile this file and other modules with -DPRINTER only if there is * a printer. */ #include #include #include #include "mongo.h" INT16 printer[] = { 1, /* equal axis ratios */ 1, /* solid line type */ 1, /* line color index to use - white */ 3, /* marker type - star */ 1, /* marker color index - white */ 1, /* text font to use - normal */ 1, /* text color - white */ 0, /* fill interior style - hollow */ 0, /* fill style index - plain */ 1, /* fill color index - white */ 1, /* send device messages to screen */ 'P', 'R', 'I', 'N', 'T', 'E', 'R', ' ' /* device name */ }; /* set up printer as graphics output device */ init_print() { INT16 dev_info[66], text_attrib[10], border, err_report; /* open printer workstation */ PRINT = 1; err_report = v_opnwk(printer, &dev_prt, dev_info); if (err_report != 0) { wselect(text_w); wprintf(text_w,"error opening printer: %d\n", vq_error()); return; } /* set graph borders and text borders */ vqt_attributes(dev_prt, text_attrib); PR_T_HEIGHT = text_attrib[9]; PR_T_WIDTH = text_attrib[8]; border = dev_info[51] / 20; PR_MAXX = dev_info[51] - border; PR_MINX = 2 * border; PR_MAXY = dev_info[52] - 2 * border; PR_MINY = 3 * border; /* set point and line characteristics as the current one for the screen */ vsm_type(dev_prt, cur_p_type); vsl_type(dev_prt, cur_l_type); } /* translate the file_x[] and file_y[] arrays into pr_x[] and pr_y[] arrays in NDC space for the printer, but don't round to integers in preparation for display yet - do that later so that we don't "wrap around" on the screen due to overflow. */ pr_normalize() { double fx, fy, cx, cy; int i; fx = (PR_MAXX - PR_MINX) / (maxx - minx); fy = (PR_MAXY - PR_MINY) / (maxy - miny); cx = PR_MINX - fx * minx; cy = PR_MINY - fy * miny; for (i = 0; i < num_read; i++) { pr_x[i] = file_x[i] * fx + cx; pr_y[i] = file_y[i] * fy + cy; } } /* return 1 if the given point is inside the graph space, 0 otherwise */ pr_inside(x, y) double x, y; { if ((x < PR_MINX) || (x > PR_MAXX) || (y < PR_MINY) || (y > PR_MAXY)) return(0); return(1); } /* put a point at each data point */ pr_points() { int i; double *px, *py; INT16 xy[2]; pr_normalize(); for (i = low_line - 1, px = pr_x, py = pr_y; (i < num_read) && (i < high_line - 1); i++, px++, py++) { if (pr_inside(*px, *py)) { xy[0] = *px; xy[1] = *py; v_pmarker(dev_prt, 1, xy); } } } /* connect the dots */ pr_connect() { int i; pr_normalize(); for (i = low_line - 1; (i < high_line - 1) && (i < num_read - 1); i++) pr_clip_n_draw(pr_x[i], pr_y[i], pr_x[i+1], pr_y[i+1]); } /* draw a box around the graphics area */ pr_box() { INT16 corner[10]; INT16 old_style, new_style; new_style = SOLID; /* solid line */ vql_attributes(dev_prt, corner); old_style = corner[0]; corner[0] = PR_MINX; corner[1] = PR_MINY; corner[2] = PR_MAXX; corner[3] = PR_MINY; corner[4] = PR_MAXX; corner[5] = PR_MAXY; corner[6] = PR_MINX; corner[7] = PR_MAXY; corner[8] = PR_MINX; corner[9] = PR_MINY; vsl_type(dev_prt, new_style); v_pline(dev_prt, (INT16) 5, corner); vsl_type(dev_prt, old_style); } /* in the second two arguments, put the NDC coordinates corresponding to the world coordinates given in the first two arguments */ pr_world_to_ndc(wx, wy, nx, ny) double wx, wy, *nx, *ny; { double fx, fy, cx, cy; fx = (PR_MAXX - PR_MINX) / (maxx - minx); fy = (PR_MAXY - PR_MINY) / (maxy - miny); cx = PR_MINX - fx * minx; cy = PR_MINY - fy * miny; *nx = wx * fx + cx; *ny = wy * fy + cy; } /* put hash marks on the x axis and label them; also put scaling factor if there is one */ pr_xaxis(dx) double dx; { char dummy[10]; double x1, x, ndcx, ndcy; int imax, i; double fmax; INT16 p[4]; /* find the position of the first marker on the x axis */ x1 = ((int)(minx / dx)) * dx; if (x1 < minx) x1 += dx; f_to_e(maxx, &fmax, &imax); /* put hash marks and label them */ vst_alignment (dev_prt, 1, 2, &p[0], &p[1]); p[1] = PR_MINY + 150; p[3] = PR_MINY - 150; for (x = x1; x <= maxx; x += dx) { pr_world_to_ndc(x, miny, &ndcx, &ndcy); p[0] = ndcx; p[2] = ndcx; v_pline(dev_prt, (INT16) 2, p); f_to_e(x, &x1, &i); if (i < imax) for (; i < imax; i++) x1 /= 10; sprintf(dummy, "%-4.2lf", x1); v_gtext(dev_prt, p[0], p[3], dummy); } /* print scaling factor, if there is one */ if (imax != 0) { vst_alignment(dev_prt, 0, 2, &p[0], &p[1]); p[0] = PR_MAXX - 8 * PR_T_WIDTH; p[3] -= 1.5 * PR_T_HEIGHT; v_gtext(dev_prt, p[0], p[3], "X 10"); if (imax != 1) { sprintf(dummy, "%-5d", imax); p[0] += 4 * PR_T_WIDTH; p[3] += PR_T_HEIGHT / 2; v_gtext(dev_prt, p[0], p[3], dummy); } } } /* print hash marks on the y axis and label them; also put scaling factor if there is one */ pr_yaxis (dy) double dy; { char dummy[10]; double y1, y, ndcx, ndcy; int imax, i; double fmax; INT16 p[4]; /* find the position of the first marker on the y axis */ y1 = ((int)(miny / dy)) * dy; if (y1 < miny) y1 += dy; f_to_e(maxy, &fmax, &imax); /* put hash marks and label them */ vst_alignment (dev_prt, 2, 1, &p[0], &p[1]); p[0] = PR_MINX - 150; p[2] = PR_MINX + 150; for (y = y1; y <= maxy; y += dy) { pr_world_to_ndc(minx, y, &ndcx, &ndcy); p[1] = ndcy; p[3] = ndcy; v_pline(dev_prt, (INT16) 2, p); f_to_e(y, &y1, &i); if (i < imax) for (; i < imax; i++) y1 /= 10; sprintf(dummy, "%-4.2lf", y1); v_gtext(dev_prt, p[0], p[1], dummy); } /* print scaling factor, if there is one */ if (imax != 0) { vst_alignment(dev_prt, 2, 0, &p[0], &p[1]); sprintf(dummy, "X 10"); p[0] = PR_MINX - 3 * PR_T_WIDTH; p[1] = PR_MAXY; v_gtext(dev_prt, p[0], p[1], dummy); if (imax != 1) { sprintf(dummy, "%-3d", imax); p[0] = PR_MINX; p[1] += PR_T_WIDTH / 2; v_gtext(dev_prt, p[0], p[1], dummy); } } } /* close printer workstation */ end_print () { if (PRINT == 0) return; v_clswk(dev_prt); PRINT = 0; } pr_code(x, y) double x, y; { return(((y > PR_MAXY) << 3) | ((y < PR_MINY) << 2) | ((x > PR_MAXX) << 1) | ((x < PR_MINX))); } #define SWAP t = x1; u = y1; x1 = x2; y1 = y2; x2 = t; y2 = u; code1 = code2; pr_clip_n_draw(x1, y1, x2, y2) double x1, y1, x2, y2; { double t, u; INT16 xy[4]; int code1, code2; while (1) { code1 = pr_code(x1, y1); code2 = pr_code(x2, y2); if (!(code1 | code2)) { xy[0] = x1; xy[1] = y1; xy[2] = x2; xy[3] = y2; v_pline(dev_prt, 2, xy); return; } else if (code1 & code2) return; else { /* first, make sure that point 1 is outside the window */ if (!code1) { SWAP } if (code1 & 8) { x1 += (x2 - x1) * (PR_MAXY - y1) / (y2 - y1); y1 = PR_MAXY; } else if (code1 & 4) { x1 += (x2 - x1) * (PR_MINY - y1) / (y2 - y1); y1 = PR_MINY; } else if (code1 & 2) { y1 += (y2 - y1) * (PR_MAXX - x1) / (x2 - x1); x1 = PR_MAXX; } else if (code1 & 1) { y1 += (y2 - y1) * (PR_MINX - x1) / (x2 - x1); x1 = PR_MINX; } } } } 0707070000020057661007550001460001440000010645600365145356600000700000000213Remove# shell script for removing mongo NAME=MONGO FOLDER=/u/$LOGNAME/Filecabinet/SRC rm -rf ${FOLDER}/$NAME > /dev/null 2>&1 rm /usr/bin/mongo 0707070000020060351007550001460001440000010156650432721774100000600000263017mongoR#]"  .text .data @.bss  .lib  /< N1X OQ./HJf/H#0Nl/N1x0<N@NVH0y .N1N-=|Hn0y /NLzPO=n0n.0y /NM*XOHnHnHn/< @/.N1OrgZp./9 /9 /9 /9 NO-@-Ap./9 /9 /9 /9 NO-@-A./.NXO./.NXOHnHnBB0y /NMO0n.0y /NM*XOJy grN;,0n.0y /NM*XO./.N=XO./.NA0XOHnHnBB0y /NMO0n.0y /NM*XOLN^NuNVH. /. 9 "9 N1XON1N1. /.N1XO-@-A. /9  .".N1XOJl". /. .".N1XO-@-A. /9 .".N1XOJl .".@ "` .".-@-A. /9  9 "9 N1XOJl 9 "9 @ "` 9 "9 ./.N1XOJo$HnHn/9 /9 N4O`HnHn/./.N4OHnHnp/p/0y /NMO09 @=@09 @=@-n-n. /9  .".N1XOJn&HnHn/9 /9 /./.N$.O .".N1=@ .".N1=@Hnp/0y /NK|O HnHn/./.N4O .ΰl: .ΰl.. /9  .".N1XO-@-AR`././< KHnN1O Hn0n/0n/0y /NJ0O. /. .".N1XO-@-A`JgHnHnp/B0y /NMO09 29 H牐A=@09 HЀn. S0n/0n/0y /NJ0O pgf./< XHnN1PO09 Hn09 HJj DD`nHn0n/0n/0y /NJ0OLN^NuNVH. /. 9 "9 N1XON1N1. /.N1XO-@-A. /9  .".N1XOJl". /. .".N1XO-@-A. /9  .".N1XOJl .".@ "` .".-@-A. $/9 9 "9 N1XOJl 9 "9 @ "` 9 "9 ./.N1XOJo$HnHn/9 /9 N4O`HnHn/./.N4OHnHnp/p/0y /NMO09 @=@09 @=@-n-n. /9  .".N1XOJn&HnHn/././9 /9 N$.O .".N1=@ .".N1=@Hnp/0y /NK|O HnHn/./.N4O .ΰl: .ΰl.. ,/9 ( .".N1XO-@-AR`././< ]HnN1O Hn0n/0n/0y /NJ0O. /. .".N1XO-@-A`JgHnHnBp/0y /NMO. eHnN1XO09 H"ЀЁ29 @=A=y Hn0n/0n/0y /NJ0Opg`./< jHnN1PO=y 09 HJj DD`nHn0n/0n/0y /NJ0OLN^NuNVH .N1-@-A./. .". N1XO./.N1XO-@-AHnHn/./.N4O .".N1-@`@-y 0-y 4`R-y 8-y <`> .N1-@-A`(Wrb@0; NJ././.NPO-@-A .".`LN^NuNVH0y .N1 nA-H nHH"|0 1g R` nJf`XHnHnp/p/0y /NMO09 H29 HJj DD`y =@09 29 HҁA=@.0n/0n/0y /NJ0O HnHnBB0y /NMOJy gHnHnp/p/0y /NMO09 H29 HJj DD`y =@09 29 HҁA=@.0n/0n/0y /NJ0O HnHnBB0y /NMOLN^NuNVH0y .N1 nA-H nHH"|0 1g R` nJf`.0y /NN>XOHnHnBp/0y /NMO09 HЀ"ЀЁ29 @=A09 H29 HJj DD`y =@.0n/0n/0y /NJ0O B0y /NN>XOHnHnBB0y /NMOJy g.0y /NN>XOHnHnBp/0y /NMO09 HЀ"ЀЁ29 @=A09 H29 HJj DD`y =@.0n/0n/0y /NJ0O B0y /NN>XOHnHnBB0y /NMOLN^NuNVH0y .N1 nA-H nHH"|0 1g R` nJf`LHnHnp/p/0y /NMO09 H29 HJj DD`y =@09 y =@.0n/0n/0y /NJ0O HnHnBB0y /NMOJy gHnHnp/p/0y /NMO09 H29 HJj DD`y =@09 y =@.0n/0n/0y /NJ0O HnHnBB0y /NMOLN^NuNqNVH. t/9 p .". N1XOJf n x!y | nB`|. /9 .". N1XOJl p-@`p-@. /9 .". N1XOJl .". @ "` .". -@-A . /9 .". N1XOJlXB. /9 .". N1XOJl.. /9 .". N1XO-@-A S``TB. /9 .". N1XOJo.. /9 .". N1XO-@-A R` .N1. /.N1XO-@-A n !n n LN^NuNVH. /9 .". N1XOJf 9 "9 `Jo:Jo.. /9 .". N1XO-@-A S``6Jl.. /9 .". N1XO-@-A R` .". `LN^NuNqNVHBpdo ."| BR`LN^NuNVHB nJg nRHHѮ`pd. .N1`LN^NuNVH.N-@l`P ."| -qJg0 n./.N1XOJf n` n-h`̑` LN^NuNVH.Nv @-Hfnp .N1B-@Jf`d.Nh @"n"f`J.N-@ ."|  q"n#H ."| # n!n  n` LN^NuNVH.N1 .N1B @-Hf`./.N1XO n` LN^NuNVHHnHn/< /.N1O. HnN1RXO @# fHn/< 0y /N1O LN^NuNV|HJ f. 0y /N1XO`HnHn/< /.N1Orl". /< 0y /N1PO`pn p l ./< 0y /N1PO`X# BB/9 N1POB. HxHnN1PO @ g lBp o .Ѐ"ЁCB1R`HnHnHnHnHnHnHnHnHnHn/< 8HnN1O0 l .R./< V0y /N1PO ."| A./< t 9 SЀ"ЁCAHPN1POrl .R./< x0y /N1POR m``# LN^NuNV|HJ f. 0y /N1XO`HnHn/< /.N1Orl". /< 0y /N1PO`pn p l ./< 0y /N1PO`X# BB/9 N1POB. HxHnN1PO @ g lBp o .Ѐ"ЁCB1R`HnHnHnHnHnHnHnHnHnHn/< HnN1O0 l .R./< 0y /N1PO ."| ^FA./<  9 SЀ"ЁCAHPN1POrl .R./<  0y /N1POR m``# LN^NuNVH. /< /< /< Hn/< '/.N1Orl#  #  #  #  # ^F # ^J #  #   9 S-@ . lT ."9 SlB ."| A. /9  "(N1XOJo ."| A# #  ."| A. /9  "(N1XOJl ."| A# #  ."| ^FA. /9  "(N1XOJo ."| ^FA# #  ."| ^FA. /9  "(N1XOJl ."| ^FA# # R`. /9  9 "9 N1XO. /9 N1XO-@-A./. 9 "9 N1XO# # ./. 9 "9 N1XO# # . /9  9 "9 N1XO. /9 N1XO-@-A./. 9 "9 N1XO# # ./. 9 "9 N1XO# # LN^NuNVHHnHnHn/< :/.N1O-@rf*. /9 /< C0y /N1O `bpo. J0y /N1XO`>pn l # pn l # LN^NuNVH-n 0n .N1"nRHH-@r g"p g.0n /N1XO`p .0n /N1XO nB(. N LN^NuNVH#  #  y "y g( y  f p R R `. /.N1XOLN^NuNVHHnHnHn/< a/.N1O-@rf6. /9 /9 /9 /< l0y /N1O`Fpn&# # # # `. u0y /N1XOLN^NuNVHHnHxW0y /N1O =n=nBpo .ЀC3R`BBnBBnBnBnBnBn|B.A-HHnHxW 0y /N1O LN^NuNVHNB.0y .N1. H0y /N1XOHn0y /NPOHn/< KHnN1O HnNLXO @-Hf"Hn/< N0y /N1O `xHn n hNXO`dLN^NuNVH=|BnN1$=|=|P=|p0..0n/0n/0n/0n/N1O3 =|. THnN1XOHnHxW0y /N1O =|=|=|@p0..0n/0n/0n/0n/N1O3 =|. `HnN1XOHnHxW0y /N1O 0y .N1Hn/< /< NJO =@Jng40y .N1NLj./< o0y /N1PON16Hn 0y /NLPO3 3 09 H3 0.y 3 09 H3 0.29 HҁA3 3 3 0y .0y /NM|XO0y .0y /NM*XOp# # By By N.'/< NXO./< NXO.&/< NXO.*/< NXO.N/< NXO../< NXO.&/< NXO.&/< NXO.+/< NXO.,/< NXO.-/< NXO./< NXO../< NXO./< NXO.(/< NXO.3 @N{.]p/N1nXN^NuNVH Hn/./././. /.N*# J f# R j y B0(HЀ=@gPHЀ.N1B @-HBn`"HЀ"y F410.HЀ"n3Rn0.nm0.H.NN=@m y B Pf y R0R@3 V0(R@3 X y R3 Z3 \ y J3 b09 bH.N y R htf 30 b` y0 bf( y R29 VSA1Af y R29 XSA1Ah`rp09 Vrr29 ^SЁr29 ^.N1S-@"y R3@fp09 Xrr29 `SЁr29 `.N1S-@"y R3@h y B0(HЀ=@gH.N y B0(HЀ=@g0.HЀ01Hr29 ^.N1-@0.HЀ"y FA".0Rn0.n l`>NV y0 bgfBn`.gXHЀ"y NJqg0.HЀ01Hrr29 `ЁS-@0.HЀ"y NA". `0`XN^Nu0.HЀ"y NJqg@0.HЀ01Hrr29 ^ЁS-@0.HЀ"y NA". ^0Rn0.n l`:NVp/./.Ne>X @# f n N^Nupѹ  y `NV0. nn 0. nl 0.HN^Nu0. H`NV0. no0.`0. nl 0.HN^Nu0. H`NV=n l 0.D@=@ nBP-n nA-H nb0.H =@HЀ"Ё2.@=A=n nR.0JnfJn l nbbR-0.n=@-n nA-H`"B@=@ nR"n nS ne0.HN^Nu n0p`NVp0. r2..N1rHN^NuNV.N1 "nA-H ngp n.f N^Nu`NVNN^NuNVJy lfJ=|`.0.2"| r# | B | B0.SnJ@f3 l <N^NuNVJn g n f<09 >H@g > <N^Nu0. H.N=@3 >H`0. H.N`NVJn g n f`09 >H@g9 >g 3 >`09 >H@g <N^NuJy >f <`0. H.N=@H`0. H.N`NV0. H.NR=@H f6Jn g n f*09 >H@g9 >g 3 >`By >0. H b@0; NJ   p.0. d"| A/N1X# mp./< /9 N1,PJobp./<  /9 N1,PN1"9  f>S gp.//9 N1Pp./< /9 N1P. N1B0. H.N0. H.N 0. 2"| r.N1B0. 2"| .N1H0. 2"| .N1H0. 2"| Bq0. 2"| Bq0. 2"| r# <N^Nup.0. H"Ё"| A//9 N1,P. N1B0. d"| A.N1`. N1B`0.H`NVNN^NuNVJy lgD=|`$0.H.N0.H.Nl0.H.N0.SnJ@fBy lpN^Nu <`NVH 0. H.N=@H ft0. 2"| 410. 2"| q0. 2"| 610. 2"| Rq01Cf 0. H.N < L N^Nu0.H`NV`" n R HH.0. H/NlX=@0.SnJ@f0.HN^NuNV. 0. H/NX=@Hg0.HN^NuNV.HH.0. H/NXN^NuNV.HH.0. H/NX=@Hg0.HN^NuNV`&HH.0. H/NX=@Hf R n Jf0.HN^NuNVJy lfNV n m <N^Nu0. 2"| r f <` |  Jf 0. H.N <`NV0. 2"| r f <N^Nu0. 2"| r 1`NVH 0. H.NN=@Jn g n f* nf y >`0.Hg3 >0.Hg0. 2"| 3p.0. 201r2/N1TX @$H0. 2"| #fJ0. 2"| Sqg6p.0. 201r2/N1TX @&H0. 2"| #g0. H.N =@Hg0.HL N^Nu0. H.N&`Jnm <`0.H`NV0. 2"| JqgN0. 201H.0. 2"| /10. 2"| r/1N1P0. 2"| Bq <N^NuNV0. H.N=@H fL0. H.Nh0. H.Nh g& n "|   |  B <N^Nu <`0.H`NVHp n l 0. H"| H.N1 @-H` n g <LpN^Nu# hJn g n f -y h` n f. `.N1 @-H.N1 r2R.N1B @(H0. 2"| #.0. 2/1N1XJgH n |fBpѮ. /.N1X @-H0. 2"| rA"n) HH `p./.N1 XJg8./.N1HX(0. 2"| r#0. 2.N1B. /.N1XJgp/./.Ne>X @./< NN1X. O/< 0. d"| A/N1Pp.0. d"| A/N1 X# fp.0. d"| A/N1X# lp`p./< /9 N1,PJo(p./<  /9 N1,PN1"9  g. N1Bp`p./.N1X*0. 2"| r#l <`0. H"Ё"| A./<T0. 2"| r/1N1P0. H"Ё,0. H"Ё"| A"|  0. /.N1XJgJ l.0. d"| A/N1HX# lp`p# N1#  p./< /9 N1Pp./<  /9 N1Pp.0. H"Ё"| A/`$p.//9 N1PR p./< /9 N1P. N1Bp`" <`NV0. H.N =@H fZ |  Jf.p. |  /0. 2"| r/1N1,PJo <N^Nu |  B < `0.H`NVH0. 2"| r gp n fp0. H"Ё"| q0. H"Ёq0. H"Ё"| q0. H"Ё"| Bq`TLN^Nu0. H"Ё"| q0. H"Ёq0. H"Ё"| 30. H"Ё"| Bq0. H"Ё"| 01@@0@@>0. H"Ё30. H"Ё"| B10. H"Ё"| 0. H"Ё"| A./<T0. 2"| r/1N1P |  `NV0. 2"| r gR0. H.N0. H"Ё"| A./<T0. 2"| r/1N1P |  BN^NuNV0. 2"| r g$0. H.N&0. H.N\ |  BN^NuNV0. 2"| r g&0. H.N0. H.Nb |  N^NuNV0. 2"| r fpN^NuHn/<T0. 2"| r/1N1 AC 0 n HR@=@ (fn` n (f n (HH"H)HH퉀A2.A Ann I(HHr 㨀n)HHA"n )HH퉀A)HH鉀A=@Hn/<T0. 2"| r/1N1 p`NV0. 2"| r fpN^NuHn/<T0. 2"| r/1N1 n .S.g .g n |` n |` n B( n r2.0A n r2.@A n r2.A n r2.A n r2.@Ap` NVp./<T0. 2"| r/1N1PN^NuNVH|=|Z0<n=@=|Z=@0. Hn8 | E@6."0.Hg 0.HF`p0.Hg0.H`p0.HS b&@0; NJ \VRRL0HgSBTSC0@:E`B0SCJ@fJEgRB`F0HgSTSC0@:E`0SCJ@fJEgR`0HgSFTSC0@:E` FR0SCJ@fJEgJRF`F0HgSTSC0@:E`0SCJ@fJEg R`0HgSTSC0@:E`0SCJ@fJEgR`F0HgSTSC0@:E`0SCJ@fJEgR`0HgSFTSC0@:E` FR0SCJ@fJEgTR`0HgSFTSC0@:E` FR0SCJ@fJEgR`<0Hg SFTSC0@:E`FR0SCJ@fJEgRF`D0HgSFTSC0@:E` FR0SCJ@fJEgRF`|0HgSFTSC0@:E` FR0SCJ@fJEg@R`p0Hg STSC0@:E`0SCJ@fJEgR0. @w=@y :l0.`09 :H3 :0.y n09 >H3 >0.y @n09 @H3 @L|N^NuNVH Hn/<W09 H/N1 n@f y@ f.p/09 :H/NcP=@.p/09 >H/NcP=@.p/ <29 Jy gN L N^Nu3 `NVHB9 (By 3 $3 p ./< p/Nj(Pp./< p/Nj(Pp.Nm=|`,0."|  Bqp40."|  3Rn nmpLN^NuNVBy p ./< p/Nj(Pp./< p/Nj(Pp.NmB9 (NHN^NuNVHp./< p/Nj(Pp.Nm3  $09 $y l3 09 $"|  01y o09 $3 09 $R@=@`,0."|  Bqp60."|  3Rn nmpLN^NuNVp./< p/Nj(Pp.Nm09 "|  01y m09 A29 SA0pN^NuNV=y =y 0. HY b@0; NJ 2n09 ,H.p/0.HS/NcP=@`Rn0.y ,op=y ,HnNXp./< p/Nj(P`D09 *H.p/0.HS`09 *H.p/0.HR/NcP`p=@=@HnNTXpN^NuNV y J=h=PHnN0XpN^NuNV n0  n1y .NN^NuNVp./< p/Nj(PHnp/Hn09 ,H/p/ n0(H/Nc 3 H/Nd =@H.Hnp/Nj(Pp;.p/NjXHnp/Hn09 *H/p/ n0H/Nc 3 H/Nd =@H.Hnp/Nj(PpH.p/NjXp.NmN^NuNV y B=hBn`~ y JH=@H.p/NjXJ9 "f 0.H.NRy 09 y *o03 09 ,H.p/09 HR/NcP3 Rn0.nmzp.NmpN^NuNVBn`6J9 "f.HH.NB.HH.p/NjXRy Rn0.nep.NmN^NuNVH. /<W 09 H/N1P. /<W 09 H/N1PB. y J PfHnp/Nmr`Hnp/NjfP=@.g .fbB.Hnp/NmrP g2 .[fB.Hnp/NjfP.H@=@ @Amp`p( nDnp`pȀg0.Hr@Ѐ"| =q` n?ftBn`Hnp/NjfP .;fRn nmHnp/NjfP.HHr0"| qHnp/NjfP .MfBn0.Hgp`.HH=@`Z .Og .NfHnp/NmrP.`.H@=@Bn`.H@=@Bn` p=@=@ y B1| y R0 y R1n. /<W 09 H/N1PpLN^NuNVH Bn`f0.HЀ"y J=q0.H"| . |  | H:0.HЀ"y R3Rn nm y B1|NpL N^NuNVHn/<W09 H/N1 N1-@f./< !N1ZXHnN1XHn/<W09 H/N1 By <3 < :3 >3 @pN^NuNVBnp./< 1p/Nj(P=@J9 g$p./< 6p/Nj(P=@09 nJ9 g$p./< ;p/Nj(P=@09 nJ9 g$p./< @p/Nj(P=@09 n3 &p.Nm=@N^NuNVB.Hnp/NmrP@=@fJHn/.NPB.0."nQ"n Q n "n2)nh n0 n1nJnfHnp/NmrP g| .fjB.B.Hnp/NmrP g< .[fB.Hnp/NmrP.HH ?fA-H.p/NjfX nR Mf=|A-H0.HЀCA./.NX @-H n ;f 0.SnJ@f n ;f0."nQ"n Q n "n2)nh0.H"| 1@@ n0 n1n`R|n`B .Og .NfHnp/NmrP|n`|n`n09 H.p/ n 0H/NcP"n 209 H.p/ n 0(H/NcP"n 3@.HHg .HHN^Nup`NV. /<W09 H/N1Pp./< Ep/Nj(PpN^NuNVp09 N^NuNVH (09 y $nJy $f 3  $09 y mJy f 3  09 "|  Jqf.09 3 09 "|  3 `09 "|  0129 @lj09 =q09 "|  3 09 R@=@0.nl09 ,0.RnHЀ"| 3 `09 "|  0129 @oh09 01R@=@09 "|  3 =y 0.nl(09 .0.RnHЀ"| 3 `09 "| A29 HҁA2. y &0LN^NuNVJy g=y =y =y &=y 0."|  =qBn`00.HЀCA"| H0 | BRn nm0.y $n0`0.-@0HЀ"|  q gHnNPX0."| A2.HҁA(@0.A2.HҁA0@=@y &gR0.H29 Hr  0.H29 Hr  0.H29 Hr  N>p..HH/p/NHPRn0."|  012.@oRn0."|  =q`3 3 =y &HnN4XBn` 0.HЀC1"| Rn nmNN^NuNVH y BBh y BBhBn y B0HS 'b|@0; NJ(PXfrn<LV"PtR~ LV`ljt~>H&@N`Nن=@`NH` y B=h 0.H.p/p/p/0.H/Nc"| `. r y N`. r y  `HnHn/< rN =@09 BH.09 :H/09 jH/09 lH/Hn0.H/0.H/HnN`$. r y `pNה` . rp/p/p/ y B0( H/NcV"|  q`( y F0(H.Nv=@ y N0  y N1y  y N1y   y N1y " y B1|` y J0H.N=@ y R0 $`rN`>p.p/p/ y J0H/Nc 3 *`z y B1| y N0 y NBh`09 H.p/ y J0H/NcP3 .`*p.p/p/ y J0H/Nc 3 0"y R2` y F=h3 4`Ry 4 y 4l09 4HЀ"| h01no y NBP09 4HSЀ"| h013 2"y N3@ y B1|`"09 H.p/ y J0H/NcP3 6`L y R0 y B1|`09 H.p/ y J0H/NcP3 :`p.p/p/ y J0H/Nc 3 <`p.p/p/ y J0H/Nc 3 >`09 H.p/ y J0H/NcP3 @`~N` N٠`NV`N`Nt`p.p/ y J0H/NcPЀ"| 013 B`p.p/p/ y J0HS/Nc =@ @gp.0.HЀ"| L01H/p/ y J0(H/Nc 40.HЀ"| D30.HЀ01`Nv` y R0 * y R1y . y R1y B y N0 y NBh`> y R0 0 y R1y 6 y R1y B y NBP y N1y 2 y B1| y B1|` y R0 < y R1y @ y R1y > y R1y B y B1|`N y R0 8 y R1y : y R1y $ y R1y L y R1y N y R1y B y N0  y N1y  y N1y   y N1y " y B1| y B1|`p.p/p/ y J0H/Nc 3 L"y R2p.p/p/ y J0(H/Nc 3 N"y R3@ y B1|`209 H.p/ y J0H/NcP3 P`^=|x y :gN{0.HLN^NuNVH n=P=hJnfp`p2.Hf0.y n y f0.H2.HЁS29 Hn0.y m09 H$0.H29 H29 Hn09 n0.@=@ | @F@Bn`@Jnm0.Rn"y J1` nHH@Bn`H..HH/NX@HH2.HD.HH2.㨀@.HH..HH/09 PH/0."H/0.&H/0.H2.HЁ/0.H/NJngT.HH..HH/09 PH/0."H/0.&H/0.H2.HЁ/0.HP/NRn0.y mPnRn0.nm`.0.@=@g=n=n=n0.HЀ"| T=q0.HЀ"| \=q0.29 H.N1=@0.29 H.N1nBn`Jnm0.Rn"y J1` nHH@=n=nBn`@H..HH/NX=@=n` Bn=|`0.H2.Hg0."`09 PH=@=n`JngJ0.y n0.y nt0.H.0.&H/0.H/0.H/N `D0.y n80.y n,0.H.0.&H/0.H/0.H/N 0.n0.SnJ@fXRn0.ܰy o=n0.n0.SnJ@fRn0.y m0.nRn0.nm^N{pL N^NuNV d. n/< NX=@ y Df29 @n=@0.@2.@=@ y R0 y R1n y R1n3 y N0 n y N2<y p1A y B1| y B1|`HnNX=@f=y n0<y p=@HnHnN@PBn. n/< HnHnNn @f"HnHnN@P=@gB9 dHN^NuHnHn.HH/N =@NB9 d0.`NVRBn`$0.HЀ"Ё"nRHA0A=@ nHH"|0 1f n 0 n N^NuNV y Df n nB ./<W 09 H/N1P y Df./<W 09 H/N1PHnp/NjfP`Hnp/NjfP .?fA-H.p/NjfX nR Mf=|A-H0.HЀCA./.NX @-H n ;f 0.SnJ@f n ;f@ n 0 n 1n=n`@ .f:Hnp/NjfP .[g4` n 0 n n 1y pBn0.HN^NuNVBB.Hn/<W 09 H/N1 N^NuNVH p.p/p/ y J0(H/Nc 3 *p.p/p/ y J0(H/Nc 3 0p./ y J0( H/NcP3 8p.p/p/ y J0(H/Nc 3 3 43 B=|`0.HЀ"| D30.SnJ@fBy N3 N LBy P R Sp3 ^3 \3 Zp3 f3 d3 b3 `3d h3 .=|` | B0.SnJ@f B9 Nep.NeN=@gp.NfF0.HL N^NuN~fN|09 H.p/ y J0(H/NcP3 .09 H.p/ y J0(H/NcP3 609 H.p/ y J0( H/NcP3 :09 H.p/ y J0(H/NcP3 @3  2By T09 Đy 3 V3  X09 H.Nvp.NBn`(0.HЀ"| *410.HЀ"y R3Rn nBy @3 :3 . /<W09 H/N1P-@JmDBn=| =|=|=|@Hn/<W09 H/N1 -@JlpN^Nup.N1p./< p/Nj(Pp`NV y BBh y R"y J0B.Hnp/NjfP .f`B.Hnp/NjfP .OfBB.Hnp/NjfP .cm& .jn y R.HAb0 y B1|pN^NuNVBn y J=P hfp`p@Jy g09 *H.p/ y F0H29 H/N1XR/NcP=@09 ,H.p/09 H"y F2)H29 H/N1XR/NcP=@`<09 H29 H.p/ y F0H/NcP=@ y F=hBn`.HH.HnHnN0HC q0.gp` n0(H=@0HC q1n.0HC/1/.NzPnRBnm`@t`60HC qJ(f .0HC/1/.N6PnRBno0.HLN^NuNVp0..HnNbX n0 r"n Q"n2 n0( "n i"n3@./.NX"n@N^NuNV y B h f=| n(*`=| n(+H=@=nBn y B=h JngJ.0Na:=@.Hn/.HnHnN^0=@0.H.Na:=@`l y B h f@Hn/.Hn/.HnHnN`~.N=@HnN`X`.0.H//.NtP=@0.HN^NuNVBn=| y B0( =@H g0 g$ f~Bn=| y F=h`dRn y J0H.Nh=@ y J0("HQ=@ @l @n p0.S` y J0(H.N*=@ y F=h n0((H.0(&H/0.H/NP=@0.nn0.H=@=| @@mp`pn nmp`pnp2.=@S@=@p0.r2.2.=@J@g@0.H-@p0.2.HЁ2.HFr2.r2.®Ё2.⨑np0.2.Hgp`p=@p0.2.Hgp`pR@nn0.H2.HЁr2.N1B @-H-H-HfpN^NuBnp=@=@0.H g@ g f.p0./Hn/9 FHnN:Sn`~.p0./Hn/9 FHnNSnJ.fN nT2.0=A nT2.0=ARn`" y F=P=h.HnN6X@=n=nn`Jnf=n.p0./Hn/9 FHnNp.HnHnHnHnNHnJ.g: y B h f,Jng&.0.H//.NP=@f<-nBn=n=nn0.F@nn=@0.SnJ@f> ng".HnHnHnHnNnJnf Jng.0.H//.NP=@.N1H0.H`NV.NN^NuNV.NN^NuNVH y  PA-HBn| y B0(HЀ=@Bn y F0=@=@0(=@=@Bn0.HUЀ"y F012.@f0.HSЀ012.@fp`p=@BnJnfTn0.ngD0.HЀ"y F01n=@0.HRЀ01n=@Jnop` 0.D@=@p=@=@Jnop` 0.D@=@p=@=@0.аnn:BnHЀ=@ؐn=@֐n=@=n`.Hnp/.HHg n h,0(` n h,0(6H/ n h,0((H/Jnf0.H2.HUf0.H`p/HnHnp/NX =@f=n=n` y Br1A y B1A0.HLN^NuNV n"H1i n"H1i nJh g y0 bg$-y NA# Np.Nb# N y B=h =h0.S@H.p/ n0(H/NcP"n3@0.S@H.p/ n0(H/NcP"n3@N^NuNV nJh gJ(fBn` n(HH gH fV n0(=@=@0(=@=@ n0(=@=@0(=@=@=|` n=h=h=|=|Bn n=h =h n=hHnHnHnHnHnN^0=@0.HN^NuNV n"y B1i  n"y F21A n1A n"y F2)1A n1A n"y J1i fBn`Jp.p/p/ y J0H/Nc "n@p.p/p/ y J0(H/Nc "n@.N=|=|Bn n=h =|"n2)1A=A n"H2)1A=AHnHnHnHnHnN^0=@f~=|#BnHnHnHnHnHnN^0=@fL n=| =|=|HnHnHnHnHnN^0=@f .N~=@0.HN^NuNV n =h=h n "n1Q n "n1i. Nz n Jh g0."Hif 0.ig=|Bn=n n =h =|HnHnHnHnHnN^0=@f n =h=h n 1n n 1n. N=@ n 1n n 1nJnfl. Nz=@f\=|=|Bn n =h =|=h n =hHnHnHnHnHnN^0=@`Bn0.HN^NuNVBn=|Bn=n=| n=h g(HnHnHnHnHnN^0=@fj.N=@fZ n"n 1Q n"n 1i.N nJh g y0 bgp09 ^. nr2(/NeX.p/ n0(H/NcP"n3@p09 `. nr2(/NeX.p/ n0(H/NcP"n3@=| =| nH=@Jh g&HnHnHnHnHnN^0=@fZ n"Hi.N=@f@ y B1| y R y B1| y N"n0 y N"n1i0.HN^NuNVHBn-y F y B=h0.SnJ@gx n h,0(HS"y &$q nT=P nT=PH=@g n$0.H@=@0.H@Y@=@0.@Y@=@ n h,2. n0( H. N1=@ n h,2. n0("H. N1=@0.n=@0.n=@Jnm0."ninJnm0."ninJngT.Hnp/ n h,0(H/ n h,0((H/0.H/HnHnp/NX =@f=n=n` y Br1A y B1A0.HLN^NuNV` n"H"Q n P.N1H n PfN^NuNVHt.HH b@0; NJ">0dRr n 0("ni@ n 0"nQ` n 0"nQ@ n 0("ni@`@ n 0("ni@ n 0"nQ` n 0"nQ@ n 0("ni@JBo pLN^Nu0Hgp`p`NV.HH.0.HЀ"y FA/0. HЀA/NPN^NuNVJnl Jn f=n 0.n 0. nmBn 0. HN^NuNV` n -P n g(.HH. nA"/ n A"/N|PJm n"n !i n h"n n !I n N^NuNV n P"n!i n h"n N^NuNVH n"H n!I nmhxp.0.H/0H/NP8gH.HH.0H/0HU/NPD@=@g4p.0.H/0H/NP8.HH.0H/0H/N\P2.Hf6p*.N1B @$H f.N(pLN^Nu5C 5C5n 6p.0.H/0H/N. Hnp/p/0.HЀ"n C01H/0. H/N=@0.HL N^NuNV-y F# F.0.H/N\X=@# FHN^NuNV y Br1A y B1A. y B0(H/NXN^NuNVH@ y F=P=h y F=h=h.N=@lT0.=@=@=@0.=@=@=@0.=@=@0.=@=@.p/HnNP=@` n0(Hg0(HRg&p`(0.H,0.H2.H2.Hop`p@Jg=n=n` =n=n nJhg Bn=n` n0(S@n=@0(S@n=@0.nn"n2)SAA=@0.nn2)SAA=@0.HЀ"nC=qB.Bn`dJ.g,0.n=n0.n"n2)SAA=@=@`*0.n=n0.n"n2)SAA=@=@n0.nn0.nn.HHgA`A. n h,0(6H/ n h,0(&H/ n h,0((H/p/.HHgA`A/.HHgA`A/0.H/ n PN=@g y Br1A y B1A0.HL@N^NuNVBn y F=P=h y F=h=h y B=h =h y B=hp.p/p/0(H/Nc =@0.R@=@Bn`"0.S@=@0.H2.H2.HR. N12.@=A0.=@0.S@=@Bn`0.R@=@0.H2.H2.HR. N1n=@09 H.p/0.RnHЀ"y J01H/NcP=@=n`:=@p./0.H/0.H/HnHnp/N*=@Sn0.nlRn0.ްnmS@3 B 3 F09 3 @S@3 D 3 H-| 0Bn` 0.HЀ"y RA"n0TRn n m y B1n y N0 F y N1y H`09 H29 H.p/ y F0H/NcP3 T09 H29 H.p/ y F0(H/NcP3 V y N0 T y N1y V y B1|` y NBP y N"y F2)3 X`09 3 ^S@3 b09 3 `S@3 d-| ZBn` 0.HЀ"y RA"n0TRn nm y B1n y N29 b 0 y N29 d 1A`809 H.p/ y J0H/NcP3 ^`*p.p/p/ y J0H/Nc 3 `"y R2`p.p/p/ y J0H/Nc 3 b`p.p/p/ y J0H/Nc 3 d`p.p/p/ y J0H/Nc 3 f`n y R0d y B1|0.HN^Nu=y T09 `HЀ"| 01y V=@Bn y B=h`Rn"y J1HH.p/NjX` y J Pf hfp`p3 J09 3 LS@3 P29 3 V09 3 NS@3 R29 3 XBn`Z09 JHg0.HЀ"| J01H`p=@ nl0.HЀ"y R`0.H]Ѐ"y N3Rn nm y B1|` y B=hBn`Rn0.nl y J  l y N2. 0 y NBh` y J0(HS29 H.N1"y N209 "y J2 АA"y N3@ y RBP y B1|`0.nlJy ff>Bn=n`nRnRn0.H2.HЁ2.Hl>0.H2.HЁ"y J1@ mJy dfJy bg . nJnf . mp`p=@g09 dHgp`09 BH.09 ^H/p/p/Hn0.H/0.H/HnN0. n=@Jy bgXJngR09 n=nHn09 PH/09 ^H/p/p/HnHnp/N 09 nJy df=n0.n`.HH g fBn` 09 XnRn`V y N2.3 T009 `HЀ"| 012.@3 V y N`"NVH@0; NJ$0 | 0 ` | 0 ` | 0 0. y :m09 :H3 :0.y n09 >H3 >0.y @n09 @H3 @Ln09 >H3 >0.y @n09 @H3 @LN^NuNVH09 H.p/ y J0H/NcP=@"y R2 y JJhg<=|`*0.Hg <`p40.HЀ"y R3Rn no`L=|`80.HЀ"ЀЁ(0.HЀ"| 610.HRЀ"y R30.SnJ@f y B1|pLN^NuNVH`=|0.SnJ@gL=|0.SnJ@g0.Hg <`p:0.HЀ"ЀЁ,0.HЀ"| 3`pL`N^NuNVH09 H.p/ y J0H/NcP=@"y R2=|`<0.HRЀ"y J>10.HЀ"ЀЁ-@0.HЀ"| 30.SnJ@f=|`.0.Hg <`p=@0.HЀ"y R3Rn no y B1|pLN^NuNVpN^NuNVH n =P=h n=P=h0.nfJn m0.nlp`p6.gp`0Hn.gp`0Hn n$0(H.0."H/0.H/0.H/HnHn0. H/N*`j0.n0.nJnop` 0.D@=@p=@=@Jnop` 0.D@=@p=@=@0.nn$BnHЀ=@n40n=@=n`&Bn0.HЀ=@n40n=@=n.fp`pn.g<9 .g0.`0."H.0.H/0.H/0.H/N 0.SnJ@gf9 .gp`p29 .Hҁ@3 .JBmp`p60HЀC01n0HЀC01n0HЀCq`TpL N^NuNV. HH2.HЁ"| 1HHN^NuNVHn/<W09 H/N1 BBnBBnBnBnBnBn=n=nJy Pg-| |B.`B.|BHn/<W 09 H/N1 09 PHg <`p=@Bn`0.HЀ"| 3Rn n4m0<3 <3 :By @3 @ >pN^NuNV n0"n Ql -I-H -I n =P=h n=P=h0. H2."HЁ"| qRn0.@=@g | Pn0.nm0.Hr"| 1F..HH..HH/0.H/0.H/0.H/0.H/0.RnH/N0.n@=@oLH..HH/0.H/0.H/0.H/0.H/0.H/Nw0.n0.nnZ0.Hr"| 1FHH..HH/0.H/0.H/0.H/0.H/0.H/NpN^NuNVH Bn09 *HSЀ"| 3 . y B0(HЀ6 y F=P=h0HUЀ"y F012.@f0HSЀ012.@f Cfp`p=@t`0RBHЀ"y F=q0RBHЀ=q ng0.nf 0.ngp`p=@gRHn09 PH/09 .H/09 BH/0.H/HnHnp29 *H/N =@f=n=n=|CmN3 .0.HL N^NuNV <2.HrZ.N1"| A2. H AA-H2. HgpN^Nup`@$@$@@$%s %lf %lf%-4.2lfX 10%-5d%-4.2lfX 10%-3d??@$@$@$@$@$@4@4%s %srcannot open file %s no file open %s %d%d %d: invalid column number %s %s %s %s %s %s %s %s %s %sinconsistent data on line %d %lfinconsistent data on line %d no file open %s %d%d %d: invalid column number %s %s %s %s %s %s %s %s %s %sinconsistent data on line %d %lfinconsistent data on line %d %s %lf %lf %lf %lf%s %d %d%d %d usage: lines low high %s %lf %lf%lf %lf usage: position x_pos y_pos DISPLAY        % * 3 : @SOLIDLONG_DASHDOTDASH_DOTMEDIUM_DASHDASH_2_DOTSPOINTPLUSASTERISKCIRCLECROSSDIAMOND> %s%s ? Mongo GraphMongo Commandserror opening screen: %d clearfilexcyclineslimitsltypeptypepointsconnectboxpositionlabelreversequitaxesxaxisyaxistitleupdatedumpprinternoprinter%s %s%s %s %s%s error hardcopy PRINTER @$?@$error opening printer: %d %-4.2lfX 10%-5d%-4.2lfX 10%-3d#4FWiy$5FVfw!/>LYhu )3=GPYbks{VDIPATH/pc7300%d SIGQUIT - received quit signal: SIGILL - Illegal Instruction: SIGTRAP - Trace Trap: SIGIOT - IOT Instruction: SIGEMT - EMT Instruction: SIGFPE - Floating Point Exception: SIGBUS - Bus Error: SIGSEGV - Segmentation Violation: SIGSYS - Bad Argument to System Call: Application Terminated %@(#)drmain.c 1.7@(#)(C) 1984,1985 Graphic Software Systems, Inc@(#)All Rights Reserved. n r s { %w%DISPLAYPRINTERPLOTTERGIN/dev/ttyTERMPORTw/dev/tty/usr/spool/uucp/LCK..%s/dev/tty"! [=0C[=1C [/usr/bin/sprint[=0C   f[=1CL   P~f}~z hl&~fԬ 01.01#V -=em}-&5meu=5}ue-=M]-&5MFU=5]Uem}M]meuMFU}ue]U cc X@???O>>=?>( <02&,* **> >  @"&*2" > "" >>" >"" >""""  <""   >> "<:*2$""">""""""""""">>><""2"""">""" 8"  ">"""**6"""2*&""""""""",*"""" """ ">"""""""""***"""""""""> >88@ " <"< """"<"""< >"$"<"""" " ""  ****""""""""" <""<& $,2""""""**"""" <""">>   0I3f̙3f"D"D @UUUUU"UU"UA""AG.text<.data .bss XX1.filegAxes.c.text<.data p.bss .filegFecvt.c.text4'.data ph.bss .file gHash.c.text .data .bss hashtab .file(gInput.c.text .data .bss l.file0gIoctl.c.text.data .bss .file8gMongo.c.textl .data  .bss .file@gOutput.c.text) `.data <.bss .fileHgPrinter.c.text5`47.data <.bss .filePgv_clrwk.c.textIN.data .bss .fileXgv_clswk.c.textIN.data .bss .file`gv_gtext.c.textJ0f.data .bss .filehgv_hardco.c.textJT.data .bss .filepgv_opnwk.c.textJ.data .bss .filexgv_pline.c.textK|P.data .bss .filegv_pmarke.c.textKP.data .bss .filegv_updwk.c.textLN.data .bss .filegvq_error.c.textLj.data .bss .filegvql_attr.c.textLz\.data .bss .filegvqt_attr.c.textLT.data .bss .filegvsl_type.c.textM*R.data .bss .filegvsm_type.c.textM|R.data .bss .filegvst_alig.c.textMp.data .bss .filegvst_rota.c.textN>.data .bss .fileggssvdi.c.textN(.data .bss .fileg_risrun.c.textO.data .bss .filegcgssvdi.c.textOJ.data tZ.bss sig_vect sig_grab tl_intin dl_ptsin hptisiz linisiz p.filegdrmain.c.text^0].data p.bss SCCSID CPYWRT RIGHTS inosiz ptosiz mypid recurse .filegrindex.c.texte>@.data >.bss .file gnewio.c.texte~.data > .bss _stat_wo >SCCSID @lkahead port_str raw_port devices Htty huse_fd use_coun cur_pid  lck_file use_buf Ncm_going lcm_checkk&_rawrset_chanm.filegbytes_op.c.textw*#.data .bss .filegcurs_esc.c.text}^.data z.bss mouse_ke .file&ggeneric.c.text.data L.bss .file.ggtext.c.text`".data T.bss .file6glocate.c.textV^).data d.bss .file>gopnwk.c.textfK.data .bss .fileFgopnwk_hook.c.text .data .bss .fileNgpublic.c.text.data #.bss .fileVgrq_choice.c.text.data .bss .file^grq_string.c.textt1.data .bss .filefgxorcur.c.textlL.data .bss .fileng_hlt_driver.c.text.data .bss .filevgescapes.c.text&.data .bss .file~gem_align.c.text.data .bss .filegem_arc.c.textt `).data .bss .filegem_dash.c.text .data .bss .filegem_data.c.text.data .bss .filegem_gin.c.textx$.data .bss .filegem_mark.c.textf.data .bss .filegem_poly.c.text2b.data .bss .filegcellarray.c.textה .data .bss .filegclrwk.c.textH>.data .bss .filegclswk.c.textن.data .bss .filegq_cellarr.c.text٠ .data .bss .filegst_height.c.textv.data .bss .filegst_rotate.c.text~ .data .bss .filegatext.c.textv.data .bss .filegbyte_op.c.text.data 2.bss B_Action One_Off One_On .filegcolor.c.text@.data .bss .filegd_line.c.text,.data .bss .file gfont_byt.c.text(.data .bss font .fileggr_clrwk.c.text, .data  .bss .filegh_line.c.text*.data 8.bss .file"gpline.c.textX .data .bss .file*gq_pixel.c.text<T.data .bss timezone0tzname0patblack0patwhite04patgray0T0t_iob00_ctype0 0_iob20 %0 _dbase0errno0environ0PC0BC0 UP0ospeed0LINES0COLS0wncur0 optind0"optarg0&opterr0*optopt0.sys_nerr02FPA_flag06FPA_s0:FPA_d0>_sibuf0`_sobuf0d_tbase1shlbat1shlbatid1access1 alarm1brk1ibrk1sbrk1$chdir1*chmod10chown16chroot1<close1Bcreat1Hdup1Nexecl1Texecv1Zexecle1`execve1fexeclp1lexecvp1rexit1x_exit1~fcntl1fork1getpid1getpgrp1getppid1getuid1geteuid1getgid1getegid1gtty1ioctl1kill1link1locking1lseek1mknod1mount1msgctl1msgget1msgsnd1msgrcv1nice1open1openi1pause1pipe1profil1 ptrace1&read1,semctl12semget18semop1>setpgrp1Dsetuid1Jsetgid1Pshmctl1Vshmget1\shmat1bshmdt1hsignal1nstat1tstty1zfstat1stime1swrite1sync1syslocal1time1times1ulimit1umask1umount1uname1unlink1ustat1utime1wait1write1abort1abs1atof1clock1crypt1setkey1encrypt1ctermid1 ctime111gmtime1asctime1"tzset1(cuserid1.ecvt14fcvt1:gcvt1@fclose1Ffflush1Lfopen1Rfreopen1Xfdopen1^fread1dfwrite1jfrexp1pldexp1vmodf1|fseek1rewind1ftell1ftw1fgetc1getw1getcwd1getenv1getgrent1getgrgid1getgrnam1setgrent1endgrent1getlogin1getopt1getpass1getpw1getpwent1getpwuid1getpwnam1setpwent1endpwent1gets1getchar1 fgets1getutent1getutid1;1$E1*setutent10endutent16utmpname1<malloc1Bfree1Hrealloc1Ncalloc1Tcfree1Zmemccpy1`memchr1fmemcmp1lmemcpy1rmemset1xmktemp1~monitor1perror1popen1pclose1printf1fprintf1sprintf1fputc1putw1putpwent1puts1putchar1fputs1scanf1fscanf1sscanf1setbuf1sleep1ssignal1gsignal1strcat1strncat1strcmp1strncmp1strcpy1strncpy1strlen1 strchr1&strrchr1,strpbrk12strspn18strcspn1>strtok1Dstrtol1Jatol1Patoi1Vswab1\system1btmpfile1htmpnam1ntempnam1tttyname1zisatty1ttyslot1ungetc1_filbuf1_flsbuf1lmul__1lmul1ldiv__1ldiv1lrem__1lrem1aldiv1almul1alrem1ulmul1uldiv__1uldiv1ulrem__1ulrem1qsort1l3tol1ltol31tgetflag1tgetent1 tgetstr1tgetnum1tgoto1tputs1"form1(menu1.message14setattr1:pb_open1@O1FY1Lpb_gets1Rpb_check1Xpb_weof1^pb_seek1dpb_puts1jpb_name1ppb_empty1vpb_gbuf1|c1wrefresh1track1wcreate1initscr1cbreak1attroff1nl1attron1flushinp1noecho1inch1getch1savetty1resetty1echo1nocbreak1nonl1wdelete1wprexec1m1wgetc1kcodemap1keypad1 wsigintr1wind1w1winit1$wsetbuf1*iswind10wexit16endwin1<wgetpos1Bwgoto1Hwinstr1N1T1Z1`wnl1fwndelay1lwprompt1rwguser1xwcmd1~wslk1wlabel1wuser1wprintf1printw1wputc1wputs1wrastop1wselect1wgetsel1wsetstat1wgetstat1setty1fixterm1physclr11setterm1getterm1baudrate11slkcol1setjmp1longjmp1afmulf1afdivf1afaddf1_cvfd1 _cvif1&fltused1,nlist12fmul18fdiv1>fadd1Dfsub1J_cvdf1P_cvdi1V_cvid1\_cvfi1bafadd1hafsub1nafsubf1tafmul1zexhelp1tolower1wicon1wicoff1toupper1l64a1a64l1_bufsync1setuname1auldiv1eprintf1dbsub__1dbadd__1dbdiv__1dbmul__1ltodb__1dbtol__1dbtofl__1fltodb__1ltofl__1fltol__1ultodb__1ultofl__1aulmul1 afdiv1dbtst__1fltst__1plock1"dial1(callout1.undial14drand481:erand481@lrand481Fmrand481Lsrand481Rjrand481Xseed481^lcong481drand1jsrand1pftok1vputenv1|targets111w_target1_fpachk1_assert1bsearch1hcreate1hsearch1hdestroy1tsearch1tdelete1twalk1nrand481_startmainl_end dev_crt xscale yscale scale MINX MAXX MINY MAXY T_HEIGHT T_WIDTH    low_line xc yc   file_x file_y ^Fx y Fminx maxx miny maxy num_read fp graph_w text_w PRINT PLOT dev_prt PR_MINX PR_MAXX PR_MINY PR_MAXY   pr_x pr_y X<box-Lzvsl_typeM*. xaxisyaxis8Mpr_box;,pr_xaxis=pr_yaxisA0f_to_e4F$.v_plineK|v_gtextJ0e_to_fxlabel ylabel ~SN>title`hashlookupLinstallstrsavelget_fileget_xc&get_yc*k.linesNwgetsfix_textpositionreversedisplay v  init "v_opnwkJvq_errorLjLvsm_typeM|my_clear'ltype&ptype&points+connect,label.quit((vmy_print(5`DXv_clrwkIJv_updwkLv_clswkI)inside+"K9X1B:8; 8code0Xprinter <6v Expr_codeD_gssvdiNerr_stat _risrunO_cgssvdiOl_contro sav6 .sav7 0mypid 2msgkey xdriver |msqid 6pipeitVsig_quit[sigcont]gssvdi^0getitYV_hlt_dricm_stopi0scrn_ll :scrn_ur >u_screen{control Bptsin Fintin Jptsout Nintout Rxform Vch_intin fch_intou jnew_para`~_xfm_dsadriver__new_xfma:_xfm_32kbold_para`basenamecglimitcrindexe>gimnmxcgitochd _xfm_muletty_open Dport n_cm_stare~cm_starte_cm_opene_cm_closfFcm_openkcm_closef_cm_stopi$cm_flushmcookedtDcmtx_nowicmtx_nstj(cmrx_waijfcmtx_waij_cmtx_wajcmrx_nowmrcmtx_strjcm_handlkcm_inqrset_cooktset_rawtset_termu@get_termvj_send_brwjbytes_opwbit_map w_num last_fla in_curs_ upd_curs ent_cur}exit_cur~fdirty_cu (first_li last_lin $curs_lin  eeos~clrwkHeeolzcurloc cur_strs_curaddcurs_scr *s_rowcolq_rowcolcurtextwr_charredo_cur "savetext.rd_curks&cur_att~hard_copvideo set_attrarrow_ponattr_mas curs_att &hw_quitget_mousatointscrn_lim q_modeold_wind opnwkclswkنescapes em rem_funct em_alignvs txt_rota jtxt_repl lgtextcellarraהst_heighvst_rotats_colormax_colo dsm_heig hq_colorq_cellar٠locateVrq_choicrq_strintval_wr_m atextvtx atext_y_ scrn_siz bit_mask font_bytbyte_opbit_oplocal_gi dmouse_po ngin_initgin_poin@gin_term_show_modash .opnwk_hor_color|p_opnwk i_opnwk *crosshai rdqa_cap 0dqa_font Jdsa_font Zd_lineclr_inde no_opqa_chcelrvon_offq_curadd cur_colohdspcurxorcurls_editchplineem_markefem_polygԬem_barem_arcem_pieem_circlhalf_cur &max_curs _echorubouth_line*_code_anglet_sincos_orderm_cos_ap _filter:_interce_clip_st_arc_poi$m_map_co dm_action T_draw_cuem_dash_em_locatm_dashes  _em_lineX_m_actio _m_map_c X_m_cos_a h_m_d_0 _m_d_1 _m_d_2 _m_d_3 _m_d_4 _m_d_5 _m_d_6 _m_dashe _m_m_def m_m_def &_m_up_ve *m_up_vec J_inv_xfm_rubberb_s_free_2_pup_ordb_up_orde>_p_succx_s_linkƮ_s_unlin_s_buildD_br_setu_br_stepʲ_poly_fi _em_lmodѲ_em_fillgr_clrwk,q_pixel<ylist vdesired u_color_etextetext_edata edata end /patltgray_bufendtabsys_errlist_buf2endtablocaltimegetutlinepututlineadf_gtxcdadf_gtwrdadf_gttokwpostwaitwsigcatchwreadmousewsetmousewgetmouseresettermparselinen_targetswtargetoncur_p_typecur_l_typehigh_linex_text_posy_text_posPR_T_HEIGHTPR_T_WIDTHdraw_axesvql_attributesget_unitsvst_alignmentworld_to_ndcvst_rotationtable_initget_limitsline_typepoint_typevqt_attributesmy_updateinit_printend_printv_hardcopynormalizev_pmarkerpr_pointsclip_n_drawpr_connectpr_world_to_ndcpr_insidepr_normalizepr_clip_n_draw0707070000020057701006440001460001440000010650510365145576700001000000002664mongo.h#include typedef int (*PFI)(); typedef short INT16; struct nlist { char *name; PFI func; struct nlist *next; }; #define AR_SIZE 2000 /* types of line */ #define SOLID 1 #define LONG_DASH 2 #define DOT 3 #define DASH_DOT 4 #define MEDIUM_DASH 5 #define DASH_2_DOTS 6 #define MIN_L_TYPE 1 #define MAX_L_TYPE 6 /* types of points */ #define POINT 1 #define PLUS 2 #define ASTERISK 3 #define CIRCLE 4 #define CROSS 5 #define DIAMOND 6 #define MIN_P_TYPE 1 #define MAX_P_TYPE 6 /* maximum number of columns of data the program can read from each line of the input file */ #define MAX_COLUMN 10 /* the character typed by the user to backspace in the text window */ #define BACKSPACE '\b' #define CR '\r' #define LF '\n' /* global variables */ INT16 dev_crt, xscale, yscale, scale; INT16 MINX, MAXX, MINY, MAXY; INT16 T_HEIGHT, T_WIDTH; INT16 cur_p_type, cur_l_type; int high_line, low_line; int xc, yc; double x_text_pos, y_text_pos; /* pos where text to be drawn next */ double file_x[AR_SIZE], file_y[AR_SIZE]; /* raw coords from file */ double x[AR_SIZE], y[AR_SIZE]; /* same, but translated to NDC */ double minx, maxx, miny, maxy; int num_read; FILE *fp; short graph_w, text_w; short PRINT, PLOT; #ifdef PRINTER INT16 dev_prt; INT16 PR_MINX, PR_MAXX, PR_MINY, PR_MAXY; INT16 PR_T_HEIGHT, PR_T_WIDTH; double pr_x[AR_SIZE], pr_y[AR_SIZE]; #endif 0707070000020057711006660001460001440000010561040365145356700000700000022442README MONGO(1) UNIX 5.0 (local) MONGO(1) NAME mongo - a simple interactive graphing program DESCRIPTION Mongo allows the user to produce simple graphs composed of lines, points and text, together with labeled axes. Input is taken from files which have several columns (numeric fields separated by white space) per line; one may plot the contents of any column versus any other. Hardcopy may be produced in two ways: either by screen dump or by direct output to a printer. The first method yields graphs with an aspect ratio slightly more cramped vertically (at least on the AT&T 7300) than the screen; the second gives a much more even aspect ratio. Commands There are many commands; a brief description of each one follows: quit Quit the program, clear the screen and set the window back to its initial size. Any hardcopy plots produced via update will be made at this time. clear Clear the graphing area of the screen and any other attached graphics device such as the printer. A formfeed character will be sent to the printer and the page will be queued for printing upon exiting the program. file data Open the file data for data input. If it does not exist, the program will complain. lines n1 n2 Limit the lines of the file from which data will be read to start at line n1 and end at line n2. Line numbers start at 1, not 0. xc n Take data for the x coordinates from column number n in the file. Column separators are any white space. Non- numeric data causes bad things to happen, and will probably screw up all following operations. yc n Same as xc above, but for the y coordinates. limits [ x1 x2 y1 y2 ] Page 1 (printed 4/17/86) MONGO(1) UNIX 5.0 (local) MONGO(1) If four arguments are present, set the limits of the plot to the given values: the x-values range from a lower limit of x1 to x2, the y-values from y1 to y2. If no arguments are given, set the limits to the extremes of the data (so that all points should appear in the plot). points Place the current point markers (set by ptype) at each one of the data points which are within the screen boundaries. ptype [ value ] If an argument is given, set the current point type to the given value; with no argument, report the current point type. Possible types are POINT, PLUS, ASTERISK, CIRCLE, CROSS, DIAMOND. The default is PLUS. connect Draw lines connecting the current data points, clipping lines to off-screen points at the plot boundaries. The type of line may be selected via ltype. ltype [ value ] If an argument is given, set the current line type to the given value; with no argument, report the current line type. Possible line types are SOLID, LONG_DASH, DOT, DOT_DASH, MEDIUM_DASH and DASH_2_DOTS. DOT is the default. box Draw four solid lines on the screen, outlining the plot area. axes [ xscale yscale ] Similar to box above, but the axes (x on the bottom, y on the left) are tick- marked and labeled with the values of the respective variable. Each value is in the form of a single digit, a decimal point and two decimal places; the scale factor is placed on the far end of the axis. If arguments xscale and yscale are given, they are used to scale the x axis and the y axis, respectively. Otherwise, the axes are scaled by the program with reasonable values. xaxis label Place the text string label, which may be several words, horizontally below the x axis. Page 2 (printed 4/17/86) MONGO(1) UNIX 5.0 (local) MONGO(1) yaxis label Place the text string label vertically (reading upwards) to the left of the y axis. title label Place the string label above the graph and centered on it. position [ xp yp ] If two numeric arguments are given, move the current text position to the location (xp, yp) on the graph. Both xp and yp must be in the current graph coordinates (i.e. if x runs from 1 to 6 and y from 4 to 12, one might say position 2 11 to move into the upper left-hand corner of the plot. If no arguments, report the current text position. label text Place the string text, which may be more than one word, at the current text position on the graph. If the current position is not inside the plot boundaries, do nothing. reverse Applies only to the graphics window of the screen. Reverse the color of the screen so that what was previously black is white and the white is black. The following commands are used only with attached external hardcopy devices such as printer. printer Open the printer workstation for hardcopy plots. All subsequent commands issued will be sent to the printer as well as the screen until noprinter command is issued. noprinter Close the printer workstation. dump Take a screen dump. The content of the graphics window is sent to the printer. update All graphics commands which have been given since the last update or clear are sent to the external device; thus, successive calls to update will separate hardcopy plots on the external device. Note, however, that actual hardcopy is not produced at this time, but only queued; actual printing takes place after the workstation is closed via the Page 3 (printed 4/17/86) MONGO(1) UNIX 5.0 (local) MONGO(1) quit command. BUGS The dump command is device dependent. Hardcopy is not produced immediately after each update or clear, but only after the workstation is closed via quit. This seems to be a GSS_Drivers "feature," but it might be possible to flush output to external devices via some system call - it certainly would be nice. In the current version, the windows, once created, cannot be moved or resized. Resizing or moving the windows causes bus error and termination of the program. AUTHORS Ann Takata and Michael Richmond. Send mail to astrovax!richmon. Page 4 (printed 4/17/86) 0707070000020057721006440001460001440000010515320365145713500001100000000066testdata1 1 1 2 2 3 3 4 5 4 8 7 5 6 9 6 2 1 7 4 3 8 8 5 9 6 7 0707070000020057721006440001460001440000010515320365145713500001300000000000TRAILER!!! the bottom, y on the left) are tick-