jimomura@lsuc.uucp (Jim Omura) (05/25/88)
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# ReadMe
# crsrmkr.c
# This archive created:
# By: Jim Omura ()
cat << \SHAR_EOF > ReadMe
88/05/24
'crsrmkr'
This program isn't really finished. Enough is working that
I have used it to make 2 cursors for an application which is my
main concern at this time. I have just made arrangements to
distribute some of my utilities commercially, so even if I
get around to finishing this one, there's a chance that the
at some point, future versions may not be public domain. But
this one is, and being source code, you can finish it as you
wish.
Cheers! -- Jim O.
SHAR_EOF
cat << \SHAR_EOF > crsrmkr.c
/* crsrmkr.c */
/* CoCo3 OS-9 Windows Cursors module */
/* This Version Public Domain
* May 1988 By Jim Omura,
* 2A King George's Drive
* Toronto, Ontario, Canada
*
* NOTES: A buffer can't hold more than 8K bytes. Therefore,
* try to keep data under 8000 bytes.
*/
#include <stdio.h>
#include <modes.h>
#include <sgstat.h>
#define ERROR -1
#define FALSE 0
#define STDIN 0
#define STDOUT 1
#define STDERR 2
#define TRUE 1
typedef struct scrnmat {
char fmtcode;
int pixwd;
int pixhi;
int clrs;
} SCRNMAT ;
/* Globals: */
/* Embedded Constants: */
char bckspcs[] = {0x08,0x08,0x08};
char ldhdr[] = {
0x1b,
0x2b
};
char curhome = 0x01; /* Home Cursor */
char scrnclr = 0x0c; /* Clr screen & Home */
/* Screen Formats: */
SCRNMAT cocomats[] = {
{ 0x05, 640, 192, 2}, /* high mono */
{ 0x06, 320, 192, 4}, /* low 4 color */
{ 0x07, 640, 192, 4}, /* high 4 color */
{ 0x08, 320, 192, 16} /* low 16 color */
};
/* Variables: */
char bufnum; /* Buffer Number */
char databuf[0x0100]; /* 4K big enough? */
int dimx; /* X size of array */
int dimy; /* Y size of array */
int fllen; /* No. bytes of data */
char grpnum; /* Buffer Group Number */
char hdrbuf[11]; /* Holds Existing Header */
char inbuf[5]; /* Input buffer */
char pathname[80];
main(argc,argv)
int argc;
char **argv;
{
/* Declare Local Variables */
int choice;
int dtoffst; /* Data Pointer offset */
char format; /* Screen format */
int flpath; /* File path */
int itnum; /* current item within buffer */
int report;
/* Set Defaults */
bufnum = 1;
dtoffst = 0;
fllen = 0;
flpath = STDIN;
format = cocomats[3].fmtcode; /* low 16 color */
grpnum = 1;
dimx = 8;
dimy = 8;
for( ;argc > 1;)
{
++argv;
--argc;
if(**argv == '-')
{
for (;;)
{
++*argv;
switch((int) **argv)
{
case '\0':
break;
case '?':
shorthelp();
exit(0);
default:
continue;
} /* Endswitch */
} /* Endloop more chars */
continue;
} /* Endif dash handler */
if (flpath == STDIN) /* Unix type file openning */
{
flpath = open(*argv,3);
if (flpath == ERROR)
{
fprintf(stderr,"CRSRMKR: File openning error\n");
exit(0);
} /* Endif open error */
continue;
} /* Endif open input file */
} /* Endloop arghandler */
/* Clear the Screen: */
putc(scrnclr,stdout);
fflush(stdout); /* Be sure it goes out! */
/* Main Loop: */
for(;;)
{
choice = showmenu();
switch(choice)
{
case 0: /* Help */
case 1: /* Select Group/Buffer/item */
itnum = gbichange(itnum);
continue;
case 2: /* Edit Pattern */
putc(scrnclr,stdout);
editpat(format);
putc(scrnclr,stdout);
continue;
case 3: /* Change Format */
case 4: /* Load File */
/* 2. choice -- load file or separate file
* into individual files */
/* One Group per file -- else abort load */
fprintf(stderr,"Not implimented\n");
continue;
case 5: /* Save File */
report = filesave(flpath,format);
continue;
case 6: /* Exit Program */
printf("Are you sure [yn]?:");
fflush(stdout);
if (getchar != 'y')
{
continue;
}
break;
default:
continue;
} /* Endswitch choice */
break;
} /* Endloop main loop */
exit(0);
} /* End of main() */
/* --------------------------- */
gbichange(itnum)
int itnum;
{
extern char bufnum;
extern char grpnum;
char tempval;
for (;;)
{
printf("Group %3d Buffer %3d Item %3d\n",(grpnum & 0xff),(bufnum & 0xff),itnum);
printf("New Group (q = quit, 0 = unchanged)? ");
fwrite(bckspcs,1,3,stdout);
fflush(stdout);
fgets(inbuf,3,stdin);
if (*inbuf == 'q')
{
break;
}
tempval = (char) atoi(inbuf);
if (tempval != 0)
{
grpnum = tempval;
printf("New Group %3d\n",(grpnum & 0xff));
}
printf("New Buffer (q = quit, 0 = unchanged)? ");
fwrite(bckspcs,1,3,stdout);
fflush(stdout);
fgets(inbuf,3,stdin);
if (*inbuf == 'q')
{
break;
}
tempval = (char) atoi(inbuf);
if (tempval != 0)
{
bufnum = tempval;
}
}
return (itnum);
}
/* ----------------------------- */
editpat(format)
char format;
{
extern char bckspcs[];
extern char curhome;
extern char databuf[0x0100]; /* 4K big enough? */
extern int dimx;
extern int dimy;
int edoffst; /* offset of char to edit */
extern int fllen;
char newval;
extern char scrnclr;
int pixnum;
int pixval;
int ppbyte; /* pixels per byte */
int xcntr;
int ycntr;
ppbyte = 2; /* For 16 color modes */
putc(scrnclr,stdout);
fllen = dimx * dimy / ppbyte;
for(;;)
{
/* Show Pattern */
fflush(stdout);
putc(curhome,stdout);
ycntr = 0;
printf("px# 0 1 2 3 4 5 6 7\n"); /* Change later */
for(;;) /* Y loop */
{
if (ycntr == dimy)
{
break;
}
xcntr = 0;
printf("\n %4d",(ycntr * dimx));
for(;;) /* X loop */
{
if (xcntr == dimx)
{
break;
}
pixnum = (ycntr * dimx) + xcntr;
pixval = getpixel(pixnum,format);
printf(" %2x",(pixval & 0xff));
++xcntr;
}
++ycntr;
}
/* Request Change */
printf("\nPixels / byte = %1d\n", ppbyte);
printf("q to quit or Byte to change? ");
fwrite(bckspcs,1,3,stdout);
fflush(stdout);
fgets(inbuf,5,stdin);
if (*inbuf == 'q')
{
break;
}
edoffst = atoi(inbuf);
printf("Change to? ");
fwrite(bckspcs,1,3,stdout);
fflush(stdout);
fgets(inbuf,5,stdin);
newval = (char) atoi(inbuf);
databuf[edoffst] = newval;
/* Make Change */
continue;
}
}
int
getpixel(pixnum,format)
int pixnum;
char format;
{
extern char databuf[0x0100]; /* 4K big enough? */
int pixval;
int ppbyte; /* pixels per byte */
int pixoffst;
ppbyte = 2; /* for 16 color */
pixval = (int) databuf[pixnum / ppbyte];
pixoffst = ((ppbyte - 1) - (pixnum - ((pixnum / ppbyte) * ppbyte)));
pixval = pixval >> ((8 / ppbyte) * pixoffst);
pixval = pixval & (0xff >> (8 / ppbyte));
return(pixval);
}
/* ------------------------------ */
int
filesave(flpath,format)
int flpath;
char format;
{
extern char bufnum;
extern char databuf[0x100];
extern int dimx;
extern int dimy;
extern int fllen;
extern char grpnum;
extern char ldhdr[2];
extern char pathname[80];
int report;
if (flpath == STDIN)
{
printf("Filename?");
fflush(stdout);
fgets(pathname,80,stdin);
if(strlen(pathname) == 0)
{
printf("No path give\n");
return(0);
}
report = creat(pathname,3);
if (report == ERROR)
{
printf("Cannot open path\n");
return(0);
}
flpath = report;
write(flpath,ldhdr,2);
write(flpath,&grpnum,1);
write(flpath,&bufnum,1);
write(flpath,&format,1);
write(flpath,&dimx,2);
write(flpath,&dimy,2);
write(flpath,&fllen,2);
write(flpath,databuf,fllen);
printf("Done\n");
return(0);
}
}
int
showmenu()
{
extern char inbuf[5];
putc(curhome,stdout);
fflush(stdout);
printf(" 0. Help\n");
printf(" 1. Select Group/Buffer/Item\n");
printf(" 2. Edit Pattern\n");
printf(" 3. Change Format\n");
printf(" 4. Load File\n");
printf(" 5. Save File\n");
printf(" 6. Exit Program\n");
printf("\n ?");
fflush(stdout);
fgets(inbuf,5,stdin);
return(atoi(inbuf));
}
shorthelp()
{
fprintf(stderr,"CRSRMKR: [-?] [filename]\n");
fprintf(stderr,"Cursor editor\n");
fprintf(stderr," default: filename will be requested later\n");
fprintf(stderr," ? Short help\n");
fprintf(stderr," filename is an existing file\n");
} /* End of shorthelp() */
/* End of crsrmkr.c */
SHAR_EOF
# End of shell archive
exit 0
--
Jim Omura, 2A King George's Drive, Toronto, (416) 652-3880
ihnp4!utzoo!lsuc!jimomura
Byte Information eXchange: jimomura