home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
files
/
telecomm
/
uniterm
/
unidemo.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-09-26
|
7KB
|
259 lines
/*
* UniTerm demo program by Simon Poole 16.03.88
*
* THIS IS REALLY JUST A QUICK HACK
*/
#include <stdio.h>
#include <ctype.h>
#include <osbind.h>
#include "uni.h"
#define E_PINVALID 1
#define E_PCORUP 2
#define E_FOPEN 3
#define TMP "TMPDIR"
#define EDITOR "E:\\TEMPUS.PRG"
#define TRUE 1
#define FALSE 0
char *getenv();
UniStruct *atol();
void exec_editor();
char *get_tmp();
void usage();
void error();
void dump_clip();
void read_clip();
void dump_hist();
main(argc, argv)
int argc;
char **argv;
{
char clip_name[127],hist_name[127],tmpname[255];
UniStruct *UniParm;
int history,clip,i;
/* less than one argument is no good */
if (argc < 2) usage();
/* init */
history=clip=FALSE;
/*******************************************************/
/* Work thru commandline arguments */
/*******************************************************/
for (i = 0;i < argc;i++) {
if (*argv[i] == '-') {
argv[i]++; /* strip off '-' */
switch(*argv[i]++) {
case 'U' : if (*argv[i] == (char)0) {
if (i < argc) {
i++;
UniParm = atol(argv[i]);
}
else usage();
}
else UniParm = atol(argv[i]);
break;
case 'H' : history = TRUE;
break;
case 'C' : clip = TRUE;
break;
default : usage();
break;
}
}
}
if (!(history || clip)) usage(); /* we want to do something! */
/* some probably useless checks */
if (UniParm == 0) error(E_PINVALID);
if (UniParm->PBLength < 50) error(E_PCORUP);
/* assume everything is ok if we got this far */
clip_name[0] = '\000';
if (clip) {
/* get name of tmp file */
strcpy(clip_name,get_tmp("C_XXXXXX"));
/* dump the clipboard */
dump_clip(UniParm,clip_name);
}
hist_name[0] = '\000';
if (history) {
/* get name of tmp file */
strcpy(hist_name,get_tmp("H_XXXXXX"));
/* dump the clipboard */
dump_hist(UniParm,hist_name);
}
/* startup the editor */
strcpy(tmpname,clip_name);
strcat(tmpname," ");
strcat(tmpname,hist_name);
exec_editor(tmpname);
/***************************************************/
/* remove the files and bye-bye */
/***************************************************/
if (history) unlink(hist_name);
if (clip) {
/* read file back into clipboard */
read_clip(UniParm,clip_name);
unlink(clip_name);
}
exit(0);
}
/**********************************************************/
/* open the file for writing and dump the history to it */
/**********************************************************/
void dump_hist(UniParm,tmpname)
char *tmpname;
UniStruct *UniParm;
{
FILE *fd;
register long i;
register char *Buf; /* only needed for efficency */
long top,bottom;
if ((fd = fopen(tmpname,"w")) == (FILE *)NULL) error(E_FOPEN);
Buf = UniParm->PBHistBuffer;
top = *UniParm->PBHistPtrAdr - (long)Buf;
bottom = *UniParm->PBHistBotAdr - (long)Buf;
if (top >= bottom)
for (i=bottom;i < top;i++) putc(Buf[i],fd);
else {
for (i=bottom;i < UniParm->PBHistSize;i++) putc(Buf[i],fd);
for (i=0;i < top;i++) putc(Buf[i],fd);
}
fclose(fd);
}
/**********************************************************/
/* open the file for writing and dump the clipboard to it */
/* map CR to \n */
/**********************************************************/
void dump_clip(UniParm,tmpname)
char *tmpname;
UniStruct *UniParm;
{
FILE *fd;
register long i;
register char *ClipBuf,ch;
ClipStruct *ClipRec; /* only needed for efficency */
if ((fd = fopen(tmpname,"w")) == (FILE *)NULL) error(E_FOPEN);
ClipRec = UniParm->PBClipRecAdr;
ClipBuf = ClipRec->ClipBuffer;
for (i=0;i < ClipRec->ClipLen;i++) {
ch = ClipBuf[i];
if (ch=='\r') putc('\n',fd);
else putc(ch,fd);
}
fclose(fd);
}
/****************************************************/
/* copy the file back into the clipboard */
/* map \n to CR */
/****************************************************/
void read_clip(UniParm,tmpname)
char *tmpname;
UniStruct *UniParm;
{
FILE *fd;
register long i;
register char *ClipBuf;
ClipStruct *ClipRec; /* only needed for efficency */
if ((fd = fopen(tmpname,"r")) == (FILE *)NULL) error(E_FOPEN);
ClipRec = UniParm->PBClipRecAdr;
ClipBuf = ClipRec->ClipBuffer;
if (fd != (FILE*)NULL) {
for (i=0;(!feof(fd))&&(i<UniParm->PBClipSize);i++){
ClipBuf[i]=getc(fd);
if (ClipBuf[i] == '\n') ClipBuf[i] = '\r';
}
ClipRec->ClipLen = --i;
}
else error(E_FOPEN);
fclose(fd);
}
/********************************************************/
/* get a unique (hopefully) filename on tmp if possible */
/********************************************************/
char *get_tmp(fname)
char *fname;
{
char *tmpdir,tmpname[255];
mktemp(fname); /* get a temp name */
if ((tmpdir = getenv(TMP)) != (char *)NULL) {
strcpy(tmpname,tmpdir);
strcat(tmpname,fname);
return(tmpname);
}
else return(fname);
}
/*****************************************************/
/* startup the editor with the file(s) as argument(s)*/
/*****************************************************/
void exec_editor(fname)
char *fname;
{
char *editor,args[255];
int result;
editor = EDITOR;
/* args is a Pascal type string, copy fname in to it */
args[0] = (char)strlen(fname);
args[1] = '\000';
strcat(args,fname);
/* and exec the editor */
result = Pexec(0,editor,args,0L);
if (result) error(result);
}
/**************************************/
/* hey we've got a really stupid user */
/**************************************/
void usage()
{
puts("Usage: unidemo.prg -H -C -U address");
getchar();
exit(0);
}
/**************************************/
/* something went really wrong */
/**************************************/
void error(num)
int num;
{
exit(num);
}