french@caip.RUTGERS.EDU (12/12/85)
From: "french robert%d.mfenet"@LLL-MFE.ARPA
Part two of MAND.C...
------------------------ Cut here! -----------------------------
case 'M':
if (secchar == 'X') {
sscanf(argpos,"%d",&temp);
if (temp < 5 ||
(temp > 320 && !(color_mode & 4)) ||
(temp > 640 && (color_mode & 4))) {
fputs("Illegal parameter!\n",console);
goto command;
}
max_x = temp;
max_mem = max_mem_y * MAXX;
max_mem /= max_x;
if (v_fp) {
fclose(v_fp);
v_fp = NULL;
}
goto command;
}
if (secchar == 'Y') {
sscanf(argpos,"%d",&temp);
if (temp < 5 ||
(temp > 200-STARTY && !(color_mode & 2)) ||
(temp > 400-STARTY && (color_mode & 2))) {
fputs("Illegal parameter!\n",console);
goto command;
}
max_y = temp;
if (v_fp) {
fclose(v_fp);
v_fp = NULL;
}
goto command;
}
if (secchar == 'C') {
sscanf(argpos,"%d",&temp);
if (temp * color_inc + color_offset > 4095) {
fputs("More than 4096 colors!\n",console);
goto command;
}
if (temp < 2) {
fputs("MaxCount must be greater than 1\n",console);
goto command;
}
max_count = temp;
goto command;
}
if (secchar == 'M') {
sscanf(argpos,"%d",&temp);
if (temp < 5) {
fputs("Number of lines must be >4!\n",console);
goto command;
}
free(v_mand_store);
v_mand_store = (UWORD *)malloc(MAXX*temp*sizeof(UWORD));
if (v_mand_store == NULL) {
fputs("Can't allocate that much memory for set storage",console);
v_mand_store = (UWORD *)malloc(MAXX*max_mem_y*sizeof(UWORD));
if (v_mand_store == NULL)
abort("Can't reallocate memory!!!");
goto command;
}
max_mem_y = temp;
if (v_fp) {
fclose(v_fp);
v_fp = NULL;
}
max_mem = MAXX * max_mem_y;
max_mem /= max_x;
goto command;
}
ill_cmd();
goto command;
case 'L':
if (v_fp) {
fclose(v_fp);
v_fp = NULL;
}
v_fp = fopen(stpblk(cmd+1),"r");
if (v_fp == NULL) {
fprintf(console,"Cannot open file '%s'\n",stpblk(cmd+1));
goto command;
}
if (getc(v_fp) != 1) {
fputs("File is not in proper format\n",console);
fclose(v_fp);
v_fp = NULL;
goto command;
}
fread(&start_r,sizeof(start_r),1,v_fp);
fread(&end_r,sizeof(end_r),1,v_fp);
fread(&start_i,sizeof(start_i),1,v_fp);
fread(&end_i,sizeof(end_i),1,v_fp);
fread(&max_x,sizeof(max_x),1,v_fp);
fread(&max_y,sizeof(max_y),1,v_fp);
v_offset = 25L;
modified = FALSE;
v_starty = max_mem+1;
want_read = TRUE;
v_pos_line(0);
goto command;
case 'X':
if (secchar == 'R') {
sscanf(argpos,"%f",&scale.f);
scale.i = SPFieee(scale.i);
start_r.i = SPAdd(start_r.i,scale.i);
end_r.i = SPAdd(end_r.i,scale.i);
if (v_fp) {
fclose(v_fp);
v_fp = NULL;
}
goto command;
}
if (secchar == 'I') {
sscanf(argpos,"%f",&scale.f);
scale.i = SPFieee(scale.i);
start_i.i = SPAdd(start_i.i,scale.i);
end_i.i = SPAdd(end_i.i,scale.i);
if (v_fp) {
fclose(v_fp);
v_fp = NULL;
}
goto command;
}
ill_cmd();
goto command;
case 'Z':
if (secchar != 'R' && secchar != 'I' && secchar != 'B') {
ill_cmd();
goto command;
}
if (v_fp) {
fclose(v_fp);
v_fp = NULL;
}
if (secchar != 'I' ) {
sscanf(argpos,"%f",&scale.f);
scale.i = SPFieee(scale.i);
distance.i = SPDiv(SPFlt(2),SPSub(start_r.i,end_r.i));
center.i = SPAdd(start_r.i,distance.i);
scale.i = SPMul(scale.i,distance.i);
start_r.i = SPSub(scale.i,center.i);
end_r.i = SPAdd(scale.i,center.i);
}
if (secchar != 'R') {
sscanf(argpos,"%f",&scale.f);
scale.i = SPFieee(scale.i);
distance.i = SPDiv(SPFlt(2),SPSub(start_i.i,end_i.i));
center.i = SPAdd(start_i.i,distance.i);
scale.i = SPMul(scale.i,distance.i);
start_i.i = SPSub(scale.i,center.i);
end_i.i = SPAdd(scale.i,center.i);
}
goto command;
case 'C':
if (secchar == 'I') {
sscanf(argpos,"%d",&temp);
if (max_count * temp + color_offset > 4095) {
fputs("More than 4096 colors!\n",console);
goto command;
}
if (temp < 1) {
fputs("Increment must be greater than 0!\n",console);
goto command;
}
color_inc = temp;
goto command;
}
if (secchar == 'O') {
sscanf(argpos,"%d",&temp);
if (max_count * color_inc + temp > 4095) {
fputs("More than 4096 colors!\n",console);
goto command;
}
if (temp < 0) {
fputs("Negative offset illegal!\n",console);
goto command;
}
color_offset = temp;
goto command;
}
if (secchar == 'S') {
sscanf(argpos,"%d",&temp);
if (temp < 0 || temp > 1) {
fputs("Illegal color set!\n",console);
goto command;
}
color_set = temp;
init_colors();
goto command;
}
if (secchar == 'M') {
sscanf(argpos,"%d",&temp);
if (temp < 0 || temp > 7 || ((temp&4) && !(temp&1))) {
fputs("Illegal graphics mode!\n",console);
goto command;
}
color_mode = temp;
if (!(color_mode & 0x2))
if (max_y > 200-STARTY)
max_y = 200-STARTY;
if (!(color_mode & 0x4))
if (max_x > 320)
max_x = 320;
goto command;
}
if (secchar == 'D') {
sscanf(argpos,"%d",&temp);
if (temp < 1) {
fputs("Divisor must be greater than 0!\n",console);
goto command;
}
color_div = temp;
goto command;
}
if (secchar == 'T') {
sscanf(argpos,"%d",&temp);
if (temp < 0 || temp > 4095) {
fputs("Color must be between 0 and 4095!\n",console);
goto command;
}
color_inset = temp;
goto command;
}
ill_cmd();
goto command;
case 'F':
sscanf(stpblk(cmd+1),"%d",&temp);
if (temp < 0 || temp > 1) {
fputs("Function number must be 0 or 1!\n",console);
goto command;
}
func_num = temp;
goto command;
case 'D':
if (v_fp == NULL) {
fputs("Must <G>enerate or <L>oad first!\n",console);
goto command;
}
if (disp_mand() == NULL)
wait_close();
goto command;
case 'G':
if (gen_mand() == NULL)
wait_close();
goto command;
case 'A':
if (v_fp == NULL) {
fputs("Must <G>enerate or <L>oad first!\n",console);
goto command;
}
if (!(color_mode & 1)) {
fputs("Cannot be in hold and modify!\n",console);
goto command;
}
anal_mand();
goto command;
case ';':
goto command; /* Lattice will complain about this line! */
case '<':
if (redir_fp) {
fclose(redir_fp);
redir_fp == NULL;
}
redir_fp = fopen(stpblk(cmd+1),"r");
if (redir_fp == NULL)
fprintf(console,"Can't open file %s!\n",stpblk(cmd+1));
goto command;
case 'Q':
abort("Bye!");
default:
ill_cmd();
goto command;
}
}
}
ill_cmd()
{
fputs("Unknown command!\n",console);
}
float cnvf(i)
int i;
{
union kludge n;
n.i = i;
n.i = SPTieee(n.i);
return (n.f);
}
/*-----------------------------------------*/
/* Non-intelligent virtual memory handling */
v_pos_line(l)
int l;
{
if (l < v_starty) {
if (modified)
v_flush();
v_starty = 0;
fseek(v_fp,v_offset,0);
if (want_read)
fread(v_mand_store,max_x*sizeof(UWORD),max_mem,v_fp);
}
if (l-v_starty > max_mem-1) {
if (modified)
v_flush();
v_starty += max_mem;
fseek(v_fp,(long)(v_starty*max_x*sizeof(UWORD)+v_offset),0);
if (want_read)
fread(v_mand_store,max_x*sizeof(UWORD),max_mem,v_fp);
}
}
v_flush()
{
fseek(v_fp,(long)(v_starty*max_x*sizeof(UWORD)+v_offset),0);
fwrite(v_mand_store,max_x*sizeof(UWORD),max_mem,v_fp);
modified = FALSE;
}
abort(s)
char *s;
{
if (cur_resource & F_MATHTRANS)
CloseLibrary(MathTransBase);
if (cur_resource & F_MATH)
CloseLibrary(MathBase);
if (cur_resource & F_CONSOLE)
fclose(console);
if (v_fp)
fclose(v_fp);
if (redir_fp)
fclose(redir_fp);
if (cur_resource & F_GRAPHICS)
CloseLibrary(GfxBase);
if (cur_resource & F_INTUITION)
CloseLibrary(IntuitionBase);
if (cur_resource & F_SETSTORE)
free(v_mand_store);
if (cur_resource & F_COLORTAB)
free(color_table);
puts(s);
exit();
}