/*NPRNGRPH.LIB*/ /*PRNGRPH.LIB with modified run_initgrph() and run_line_parameters() including print option of the parameters*/ #include <stdio.h> #include <math.h> #include <stdlib.h> #include <alloc.h> /*Codes*/ extern char IBMSpacing[10], Epsonspacing[9], spacing0[4], spacing1[5], spacing2[5], spacing3[4], spacing4[4], Head[12]; extern int *Header; extern char *spacing[5]; /*General Variables*/ extern char *Printline; extern char *Pline; extern int *Pcolumn; extern unsigned char *Charac; extern unsigned long Pointcounter; extern unsigned long Maxpoint; extern long lastcolumn; extern int ac; extern int closeflag; /*Graph Parameters*/ extern int Lines, Width, Pc, DDc; extern char *Graphpar; /*Line Parameters*/ extern int full, doble; extern double maxX, maxY, minX, minY; extern int Ptobell; extern FILE *savefile; /*Prototypes*/ void line_parameters(int full_line, int double_line, double max_X, double min_X, double max_Y, double min_Y, int point_to_bell_ratio); void initprngraph(unsigned lines, unsigned columns, unsigned margin, int density); void savegraph(char *filename); void getgraph(char *filename); void closegraph(void); int redata(void); void run_initgraph(); void run_line_parameters(); int Potencia(int basis, int exponent); void printgraph(void); void recpoint(double x, double y); void newline(void); void axis(double x, double y, double Xmark, double Ymark, int Type); void initprngraph(unsigned lines, unsigned columns, unsigned margin, int density) { unsigned intmaxpoint; /*Cancel previous initiation*/ if(closeflag != 0 ) closegraph(); if(lines > 80) {fputs("Lines has to be a positive integer less than 81\n",stdout); _exit(0);} if(columns>80) {fputs("Columns has to be a positive integer less than 81\n",stdout); _exit(0);} if(margin>80-columns) {fputs("Margin has to be a positive integer less than (81 - columns)\n",stdout); _exit(0);} if(density!=1&&density!=2&&density!=4) {fputs("Density = 1, 2 or 4 are the only allowed values\n",stdout); _exit(0);} Lines = (int) lines; Width = (int) columns; Pc = (int) margin; DDc = density; Printline = calloc(Width*6*DDc, 1); if(Printline == NULL) {fputs("Insufficient Data Memory",stdout);_exit(0);} intmaxpoint = (coreleft() - 1024)/4*4; Pline = calloc( intmaxpoint, 1); if(Pline == NULL) {fputs("Insufficient Data Memory",stdout);_exit(0);} Pcolumn = (int *) (Pline + ( intmaxpoint/=4)); Charac = Pline + 3 * intmaxpoint; Maxpoint = (long) intmaxpoint; closeflag = 1;/*Allocated memory*/ } void line_parameters(int full_line, int double_line, double max_X, double min_X, double max_Y, double min_Y, int point_to_bell_ratio) { if(full_line!=0&&full_line!=1&&full_line!=2){ fputs("full_line = 0, 1 or 2 are the only allowed values\n",stdout); _exit(0);} if(double_line!=0&&double_line!=1&&double_line!=2){ fputs("double_line = 0, 1 or 2 are the only allowed values\n",stdout); _exit(0);} if(max_X<=min_X){ fputs("min_X < max_X is expected\n",stdout); _exit(0);} /*1*/ if(min_Y == 0)minY = max_Y-(max_X-min_X)*Lines/Width*8.0/7.2; else /*2*/ { /*3*/ if(max_Y<=min_Y){ /*3*/ fputs("min_Y < max_y is expected\n",stdout); _exit(0);} /*2*/ else minY = min_Y;} /*1*/ if(point_to_bell_ratio<0){ fputs("min_Y < a non-negative value is expected for point_to_bell_ratio\n",stdout); _exit(0);} full = full_line; doble = double_line; maxX = max_X; minX = min_X; maxY = max_Y; } void savegraph(char *filename){unsigned long i; int j; savefile = fopen(filename, "wb"); if(savefile == NULL){fputs("I can't open the file",stdout); _exit(0);} for(i=0;i<=4*Pointcounter;i++) putc(*(Pline+i),savefile); for(j=0;j<=8;j++) putc(*(Graphpar+j), savefile); fclose(savefile); } void getgraph(char *filename){unsigned long i; char a; savefile = fopen(filename, "rb"); if(savefile == NULL){fputs("Unable to open the file\n",stdout); _exit(0);} Pointcounter = filelength(fileno(savefile))/4 - 2; Printline = calloc(Width*6*DDc, 1); Pline = (char *) calloc(4*(int) Pointcounter, 1); Pcolumn = (int *) (Pline +(int) Pointcounter); Charac = Pline + 3*(int)Pointcounter; for(i=0;i<=4*Pointcounter;i++) *(Pline + i) = getc(savefile); for(i=0;i<=8;i++){ *(Graphpar+i) = getc(savefile); a = *(Graphpar +i); closeflag = 1;/*Allocated memory*/ } fclose(savefile);} void closegraph(void){ free((void *) Pline); free((void *) Printline); lastcolumn = -1; Pointcounter = 0; closeflag = 0;} int redata(void){void *psave; psave = (void *) (Pline + (int) Pointcounter); memcpy(psave,(void *) Pcolumn, 2* (int) Pointcounter); psave=(void *)(Pline + 3* (int) Pointcounter); memcpy(psave,(void *) Charac, (int) Pointcounter); Pcolumn = (int *) (Pline + (int) Pointcounter); Charac = Pline + 3* (int) Pointcounter; free((void *) Pline); if(malloc(4* (int) Pointcounter)!=Pline){ fputs("Allocation of permanent memory is forbiden between initprngraph and redata",stdout);_exit(0);} closeflag = 1; } void run_initgraph(){ char buf[8]; unsigned intmaxpoint; int saveDDc; /*Cancels previous initiation*/ if(closeflag!=0) closegraph(); fputs("Graph Parameters\n",stdout); fputs("<ENTER> to confirm present value\n",stdout); fputs("<r> <ENTER> to return to the anterior parameter\n",stdout); fputs("Lines = 1 to EXIT\n\n",stdout); acx: fputs("Lines (Graphic's height - 1 Line = 1/9\") = ",stdout); fputs(itoa(Lines,buf,10),stdout); fputs("\n",stdout); fputs("Lines = ",stdout);if(*gets(buf)=='r')goto acx; if(buf[0] != '')Lines = atoi(buf);if(Lines==1) _exit(0); if(Lines>90 || Lines <=0) {fputs("It has to be a positive integer <= 90 \n",stdout); goto acx;} ac1: fputs("Width (Graphic's width in 1/10\") = ",stdout); fputs(itoa(Width,buf,10),stdout); fputs("\n",stdout); fputs("Width = ",stdout);if(*gets(buf)=='r')goto acx; if(buf[0] != '')Width = atoi(buf); if(Width>80 || Width<=0) {fputs("It has to be a positive integer <= 80 \n",stdout); goto ac1;} ac2: fputs("Margin (Graphic's left margin in 1/10\") = ",stdout); fputs(itoa((Pc=(80-Width)/2),buf,10),stdout);fputs("\n",stdout); fputs("Margin = ",stdout);if(*gets(buf)=='r')goto ac1; if(buf[0] != '')Pc = atoi(buf); if(Pc>80-Width||Pc<0) {fputs("It has to be a non-negative integer <= 80 - Width\n",stdout); goto ac2;} ac7: fputs("Density (number of points per surface's unit) (1,2 or 4) = ",stdout); fputs(itoa(DDc,buf,10),stdout);fputs("\n",stdout); fputs("Density = ",stdout);if(*gets(buf)=='r')goto ac2; if(buf[0] != '')DDc = atoi(buf);fputs("\n",stdout); if(DDc!=1&&DDc!=2&&DDc!=4) {fputs("1,2 and 4 are the only allowed values\n",stdout);goto ac7;} /*Print Graph Parameters*/ fputs("\nLines = ",stdout); fputs(itoa(Lines,buf,10), stdout); fputs(" Width = ",stdout); fputs(itoa(Width,buf,10), stdout); fputs(" Margin = ",stdout); fputs(itoa(Pc,buf,10), stdout); fputs(" Density = ",stdout); fputs(itoa(DDc,buf,10), stdout); fputs("\n",stdout); Okey: fputs("Okey?(y/n)\n",stdout); gets(buf); if(buf[0]=='n') goto acx; if(buf[0]!='y') {fputs("y or n are tke unique accepted letters\n",stdout); goto Okey;} Do: fputs("\nShould I print these graph parameters? (y/n)",stdout);gets(buf); if(buf[0]=='n') goto np1; if(buf[0]!='y') {fputs("y or n are tke unique accepted letters\n",stdout); goto Do;} fputs("Lines = ",stdprn); fputs(itoa(Lines,buf,10), stdprn); fputs(" Width = ",stdprn); fputs(itoa(Width,buf,10), stdprn); fputs(" Margin = ",stdprn); fputs(itoa(Pc,buf,10), stdprn); fputs(" Density = ",stdprn); fputs(itoa(DDc,buf,10), stdprn); fputs("\n",stdprn); np1: /*Initgraph*/ Printline = calloc(Width*6*DDc, 1); if(Printline == NULL) {fputs("Insufficient Data Memory",stdout);_exit(0);} intmaxpoint = (coreleft() - 1024)/4*4; Pline = calloc( intmaxpoint, 1); if(Pline == NULL) {fputs("Insufficient Data Memory",stdout);_exit(0);} Pcolumn = (int *) (Pline + ( intmaxpoint/=4)); Charac = Pline + 3 * intmaxpoint; Maxpoint = (long) intmaxpoint; closeflag = 1;/*Allocated memory*/ } void run_line_parameters(){ char buf[8]; double save; fputs("<ENTER> to confirm present value\n",stdout); fputs("<r> <ENTER> to return to the anterior parameter\n\n",stdout); goto ac0; acc0: closegraph(); run_initgraph(); ac0: fputs("Maximum X (Value of X at the extreme right) = ",stdout); fputs(gcvt(maxX,6,buf),stdout); fputs("\n",stdout); fputs("Maximum X = ",stdout); if(*gets(buf)=='r') goto acc0; if(buf[0] != '')maxX = atof(buf); ac4: fputs("Minimum X (Value of X at the extreme left) = ",stdout); fputs(gcvt(minX,6,buf),stdout); fputs("\n",stdout); fputs("Minimum X = ",stdout);if(*gets(buf)=='r')goto ac0; if(buf[0] != '')minX = atof(buf); if(minX>=maxX){fputs("A value smaller than Maximum X is expected\n",stdout); goto ac4;} ac5: fputs("Maximum Y (Value of Y at the top) = ",stdout); fputs(gcvt(maxY,6,buf),stdout); fputs("\n",stdout); fputs("Maximum Y = ",stdout);if(*gets(buf)=='r')goto ac4; if(buf[0] != '') maxY = atof(buf); ac6: fputs("Minimum Y (Value of Y at the bottom) = ",stdout); minY = maxY-(maxX-minX)*Lines/Width*8.0/7.2; fputs(gcvt(minY,6,buf),stdout); fputs("\n",stdout); fputs("This value of Minimum Y corresponds to Y/X = 1\n",stdout); fputs("Minimum Y = ",stdout);if(*gets(buf)=='r')goto ac5; if(buf[0] != '') {save = minY; minY = atof(buf);} if(minY>=maxY){fputs("A value smaller than Maximum Y is expected\n",stdout); minY = save; goto ac6;} ac8: fputs("Full line (Consecutive points joined by a straight line - 0, 1 or 2) = ",stdout); fputs(itoa(full,buf,10),stdout);fputs("\n",stdout); fputs("Full line = ",stdout);if(*gets(buf)=='r')goto ac6; if(buf[0] != '')full = atoi(buf); if(full!=1&&full!=0&&full!=2) {fputs("0, 1 and 2 are the only allowed values\n",stdout); goto ac8;} ac9: fputs("Line Width (0, 1 or 2) = ",stdout); fputs(itoa(doble,buf,10),stdout);fputs("\n",stdout); fputs("Line Width = ",stdout);if(*gets(buf)=='r')goto ac8; if(buf[0] != '')doble = atoi(buf); if(doble!=1&&doble!=0&&doble!=2) {fputs("0,1 and 2 are the only allowed values\n",stdout); goto ac9;} ac10: fputs("Ptobell (One bell for each group of Ptobell out-of-graph points) = ",stdout); fputs(itoa(Ptobell,buf,10),stdout);fputs("\n",stdout); fputs("0 for no bell\n",stdout); fputs("Ptobell = ",stdout);if(*gets(buf)=='r')goto ac9; if(buf[0] != '') Ptobell = atoi(buf); /*Print Line Parameters*/ fputs("\nfull = ",stdout); fputs(itoa(full,buf,10), stdout); fputs(" double = ",stdout); fputs(itoa(doble,buf,10), stdout); fputs(" maxX = ",stdout); fputs(gcvt(maxX,10,buf), stdout); fputs(" minX = ",stdout); fputs(gcvt(minX,10,buf), stdout); fputs("\n",stdout); fputs("maxY = ",stdout); fputs(gcvt(maxY,10,buf), stdout); fputs(" minY = ",stdout); fputs(gcvt(minY,10,buf), stdout); fputs(" Ptobell = ",stdout); fputs(itoa(Ptobell,buf,10), stdout); fputs("\n",stdout); Okey: fputs("Okey?(y/n)\n",stdout); gets(buf); if(buf[0]=='n') goto ac0; if(buf[0]!='y') {fputs("y or n are tke unique accepted letters\n",stdout); goto Okey;} Do: fputs("\nShould I print these line parameters? (y/n)",stdout);gets(buf); if(buf[0]=='n') goto np2; if(buf[0]!='y') {fputs("y or n are tke unique accepted letters\n",stdout); goto Do;} fputs("\nfull = ",stdprn); fputs(itoa(full,buf,10), stdprn); fputs(" double = ",stdprn); fputs(itoa(doble,buf,10), stdprn); fputs(" maxX = ",stdprn); fputs(gcvt(maxX,10,buf), stdprn); fputs(" minX = ",stdprn); fputs(gcvt(minX,10,buf), stdprn); fputs("\n",stdprn); fputs("maxY = ",stdprn); fputs(gcvt(maxY,10,buf), stdprn); fputs(" minY = ",stdprn); fputs(gcvt(minY,10,buf), stdprn); fputs(" Ptobell = ",stdprn); fputs(itoa(Ptobell,buf,10), stdprn); fputs("\n",stdprn); np2:; } int Potencia(int basis, int exponent){int j; int z=1; for(j=1;j<=exponent;j++) z*=basis; return z;} void printgraph(void){int i,j,k;int WIDTHH, PCC; /* fputs (Epsonspacing,stdprn);*/ putc('\xD',stdprn); /*RESET*/ putc('\x1B',stdprn); putc('\x40',stdprn); WIDTHH =Width*6*DDc; PCC = Pc*6; for(k=Lines*(DDc - DDc/4)-1;k>=0;k--){ for(i=0;i<Pointcounter;i++) { if(*(Pline + i) == k){ *(Printline + *(Pcolumn+i)) |= *(Charac + i); if(*(Printline + *(Pcolumn+i)) == '\x1A') *(Printline + *(Pcolumn+i))-=2; } } if(k%(DDc - DDc/4)!=0)fputs(spacing[DDc-1],stdprn); else fputs(spacing[DDc - 1/DDc],stdprn); /*Pass over the margin*/ Header[1] = Pc*6; for(i=0;i<4;i++) putc(Head[i],stdprn); for(i=0;i<PCC;i++) putc(0,stdprn); /*Print the line*/ *(Header+(2+DDc/2*4)/2) = WIDTHH; for(i=0;i<4;i++) putc(Head[i+DDc/2*4],stdprn); for(i=0;i<WIDTHH;i++) { putc(*(Printline + i),stdprn); *(Printline + i) = 0; } putc('\xA',stdprn); putc('\xD',stdprn); } putc('\x1B',stdprn); putc('\x40',stdprn); } void recpoint(double x, double y){long columna=0, line=0; int subline=0, z=0; long newcolumn=0, Tl=0;char Flag = 0; long maxdif, mindif, absmaxdif, newTl, dx, dy, j; int i; long *L1; long *L2; extern unsigned long Maxpoint; static long lastTl; int DDc4, DDc8, DOBLEE, DOBLEL, FULLE, colDOBLEE; double MAXXMINX; MAXXMINX = (maxX-minX)/(Width*6*DDc-1); DDc4 = DDc - DDc/4; if(x>maxX || x<minX ) {lastcolumn = -1; if(Ptobell!=0 && ac++%Ptobell == 0) putc(7,stdout);} else /*-2*/ {if(y>maxY || y<minY) {lastcolumn = -1;if(Ptobell!=0 && ac++%Ptobell == 0) putc(7,stdout);} else /*-1*/ { x-=minX; y-=minY; columna = (long)(x/MAXXMINX+0.5); line = (Tl=(long)(y/(maxY-minY)*(Lines*8*DDc4-1)+0.5))/8/DDc4*DDc4;/*Number of line multiple of DDc */ subline = (int) Tl%(8*DDc4); line += subline%DDc4; subline/=DDc4; if(Pointcounter > Maxpoint-1){fputs("Too much points",stdout);_exit(0);} *(Pline + (int) Pointcounter) = line; *(Pcolumn + (int) Pointcounter) = (int) columna; *(Charac + (int) Pointcounter++) += (z=Potencia(2,subline)); newcolumn = columna;/*for full line*/ newTl = Tl;/* Total number of sublines*/ /*Double line*/ if(doble > 0) /*0*/ { DOBLEE = doble/2+DDc/4 +1; DOBLEL = doble/2*DDc/4 +1; /*1*/ if(columna >= DOBLEE) { colDOBLEE = columna - DOBLEE; if(Pointcounter > Maxpoint-1){fputs("Too much points",stdout);_exit(0);} *(Pline + (int) Pointcounter) = line; *(Pcolumn + (int) Pointcounter) = (int) columna - DOBLEE; *(Charac + (int) Pointcounter++) += z; /*1*/ } else {if(Ptobell!=0 && ac++%Ptobell == 0) putc(7,stdout);} /*5*/ if(Tl >= DOBLEL){ line = (Tl - DOBLEL)/8/DDc4*DDc4;/*Number of line multiple of DDc */ subline = ( (int) Tl - DOBLEL)%(8*DDc4); line += subline%DDc4; subline/=DDc4; if(Pointcounter > Maxpoint-1){fputs("Too much points",stdout);_exit(0);} *(Pline + (int) Pointcounter) = line; *(Pcolumn + (int) Pointcounter) = (int) columna; *(Charac + (int) Pointcounter++) = Potencia(2,subline); /*5*/ } else {if(Ptobell!=0 && ac++%Ptobell == 0) putc(7,stdout);} /*0*/ } /*End of double line*/ /*Full line*/ /* FULLE = 1 + DDc/4 + doble + doble * (DDc/4);*/ FULLE = 1 + DDc/4; if(full == 2) FULLE += DDc*2; if(full>0 && lastcolumn >= 0) /*00*/ { dx = newcolumn - lastcolumn; dy = newTl - lastTl; if(labs(dx)>FULLE||labs(dy)>FULLE) /*01*/ { columna = lastcolumn; Tl = lastTl; maxdif = dx; mindif = dy; L1 = &Tl; L2 = &columna; if(labs(dy)>labs(dx)) { maxdif = dy; mindif = dx; L1 = &columna; L2 = &Tl; } absmaxdif = labs(maxdif); for(j=FULLE;j < absmaxdif; j+=FULLE) /*02*/ { columna = lastcolumn; Tl = lastTl; Flag = 0; *L1+= mindif*j/absmaxdif; *L2+=maxdif/absmaxdif*j; line = Tl/8/DDc4*DDc4;/*Multiple of DDc number of line*/ subline = (int) Tl%(8*DDc4); line += subline%DDc4; subline/=DDc4; if(Pointcounter > Maxpoint-1){fputs("Too much points",stdout);_exit(0);} *(Pline + (int) Pointcounter) =(char) line; *(Pcolumn + (int) Pointcounter) = (int) columna; *(Charac + (int) Pointcounter++) +=(z= Potencia(2,subline)); /*Double-full line*/ /*0*/ if(doble > 0){ /*1*/ if(columna >=DOBLEE) { colDOBLEE = columna - DOBLEE; if(Pointcounter > Maxpoint-1){fputs("Too much points",stdout);_exit(0);} *(Pline + (int) Pointcounter) = line; *(Pcolumn + (int) Pointcounter) = (int) columna-DOBLEE; *(Charac + (int) Pointcounter++) += z; /*1 Taken from there*/} else {if(Ptobell!=0 && ac++%Ptobell == 0) putc(7,stdout);} /*5*/ if(Tl>=DOBLEL){ line = (Tl-DOBLEL)/8/DDc4*DDc4;/*Multiple of DDc number of line*/ subline = ( (int) Tl-DOBLEL)%(8*DDc4); line += subline%DDc4; subline/=DDc4; if(Pointcounter > Maxpoint-1){fputs("Too much points",stdout);_exit(0);} *(Pline + (int) Pointcounter) = line; *(Pcolumn + (int) Pointcounter) = (int) columna; *(Charac + (int) Pointcounter++) += Potencia(2,subline); /*5*/ } else {if(Ptobell!=0 && ac++%Ptobell == 0) putc(7,stdout);} /*1 } else {if(Ptobell!=0 && ac++%Ptobell == 0) putc(7,stdout);}*//*Taken from here*/ /*0*/ } /*02*/ } /*01*/ } /*00*/ } lastcolumn = newcolumn; lastTl = newTl; /*-1*/ } /*-2*/ } } /*End of recpoint */ void newline(void){ ac = Ptobell -1; recpoint(maxX+1, 0);} void axis(double x, double y, double Xmark, double Ymark, int Type){double save1, save2, save3, save4; double u, v, w, wFULLE, xmarke, ymarke; int WIDTHH, FULLE, FULLEY, LINESS, savefull, save5, i; save5 = doble; savefull=full; save1 = maxX; save2 = maxY; save3 = minX; save4 = minY; full = 0; doble = 0; WIDTHH = Width*6*DDc; LINESS = Lines*8*(DDc-DDc/4); FULLE = 1 + DDc/4; FULLEY = 1 + DDc/4*DDc/2; if (Type == 0){/*x, y and respective marks are coordinates*/ x-=minX; y-=minY; v = (int)(x/(maxX-minX)*(WIDTHH-1)+0.5); w = (int)(y/(maxY-minY)*(LINESS-1)+0.5); xmarke =(int)(Xmark/(maxX-minX)*(WIDTHH-1)+0.5); ymarke = (int)(Ymark/(maxY-minY)*(LINESS-1)+0.5);} else {/* x and y are column and line*/ v = x; w = y; xmarke = Xmark; ymarke = Ymark;} maxX =WIDTHH - 1; maxY =LINESS-1; minX = 0; minY = 0; /*Axis X*/ u = 0.0; wFULLE = w + FULLE; for(i=0;i<WIDTHH;i+=FULLE){ recpoint(u,wFULLE); recpoint(u,w); if(xmarke!=0 && abs((int) (u-v)) % (int) xmarke < FULLE) { recpoint(u, wFULLE + FULLE); recpoint(u, w - FULLE); } u+=FULLE;} /*axis Y*/ newline(); u = 0.0; for(i=0;i<LINESS;i+=FULLE){ recpoint(v+FULLEY,u); recpoint(v,u); if(ymarke!=0 && abs((int) (u-w)) % (int) ymarke < FULLE) { recpoint(v + 2 * FULLEY , u); recpoint(v - FULLEY, u); } u+=FULLE;} maxX = save1; maxY = save2; minX = save3; minY = save4; full = savefull; doble = save5;} /*End of NPRNGRPH.LIB*/
כתיבת תגובה