/************************************************************************/
/*									*/
/*	CNet AMIGA 2.0  C language interface routines and examples	*/
/*									*/
/*	© 1991	Perspective Software ... this code may be freely	*/
/*		ditributed to and used by registered CNet owners	*/
/*		EXCLUSIVELY.  Other distribution is in violation 	*/
/*		of copyright laws.					*/
/*									*/
/************************************************************************/

void CallHost( UBYTE c );
void ShutDown( char *spawn );

struct MsgPort  *replyp;	/* Some commnunication details ...	*/
struct CPort    *cport;
struct CMessage  cmess;

struct	MainPort  *myp;		/* Pointer to CNet port--ALL info!	*/
struct	PortData  *z;

char	**bm;
struct	SignalSemaphore *SEM;
FILE	*fp;
				/* put your other GLOBALS here		*/


void main( int argc, char **argv )
{
	if( argc<2 || !(cport = (struct CPort *)FindPort( argv[1] )) ) {
		printf("This is a CNet C program.\n");
		exit(0);
	}

	if( !(replyp = CreatePort( 0,0 )))
		exit(0);

	cmess.cn_Message.mn_ReplyPort   = replyp;
	cmess.cn_Message.mn_Length      = sizeof( struct CMessage );
	cmess.cn_Message.mn_Node.ln_Name= "cstuff";

	if( cport->ack != 98 ) {	/* right CNet version running? */
	    cport->ack = 1;
	    goto err;
	}

	cport->ack = 0;

	z		=	cport->zp;
	myp		=	cport->myp;
	SEM		=	myp->SEM;
	bm		=	z->bm;

	/* put your program here */






	/* get back to CNet */

	ShutDown( NULL );

err:	DeletePort( replyp );
	exit(0);
}

void ShutDown( char *spawn )			/* another file to run? */
{
	if( spawn )
		strcpy( z->CSpawn, spawn );

	CallHost( 0 );
}

void CallHost( UBYTE c )
{
	cmess.command = c;
	PutMsg  ( (struct MsgPort *)cport, (struct Message *)&cmess );
	WaitPort( replyp );
	GetMsg  ( replyp );
}

void PutText( char *text )
{
	cmess.arg1 = (ULONG)text;	/* text to print		*/
	CallHost( 1 );
}

void PutA( void )
{
	PutText( z->ABuffer );
}

int EnterLine( UBYTE len, short flags, char *prompt )
{
	cmess.arg1 = (ULONG)len;	/* how many chars max to input	*/
	cmess.arg2 = (ULONG)flags;	/* 1=UpperCase			*/
	cmess.arg3 = (ULONG)prompt;	/* text to print before input	*/
	CallHost( 2 );			/* result is in z->InBuffer	*/
	return( (int)strlen( z->InBuffer ));
}

char GetKey( void )			/* Stop until a key is pressed	*/
{
	CallHost( 3 );
	return( (char)cmess.result );
}

void EnterPassword( UBYTE len )
{
	cmess.arg1 = (ULONG)len;	/* max number of characters */
	CallHost( 4 );
}

long CommonCommands( void )		/* Check z->InBuffer for Chat, OLM, etc */
{
	CallHost( 5 );
	return( (long)cmess.result );
}

UBYTE ReadFile( char *path, UBYTE flags )
{
	cmess.arg1 = (ULONG)path;
	cmess.arg2 = (ULONG)flags;	/* 1 = print File Not Found	*/
	CallHost( 6 );
	return( (UBYTE)cmess.result );		/* FALSE if File Not Found	*/
}

void SetDoing( char *what )
{
	cmess.arg1 = (ULONG)what;
	CallHost( 7 );
}

void CallEditor( short max, short inlines )
{
	cmess.arg1 = (ULONG)max;	/* Maximum number of lines (250)*/
	cmess.arg2 = (ULONG)inlines;	/* TRUE/FALSE use existing _edbuff? */
	CallHost( 8 );
}

UBYTE ReadGraphics( char *path, char flags )
{
	cmess.arg1 = (ULONG)path;
	cmess.arg2 = (ULONG)flags;	/* 1 = print File Not Found	*/
	CallHost( 9 );
	return( (UBYTE)cmess.result );		/* FALSE if File Not Found	*/
}

void MakeDate( struct IsDate *date, char *output )
{
	cmess.arg1 = (ULONG)date;
	cmess.arg2 = (ULONG)output;
	CallHost( 10 );
}

void ReadAccount( short id, struct UserData *user )
{
	cmess.arg1 = (ULONG)id;
	cmess.arg2 = (ULONG)user;
	CallHost( 11 );
}

void SaveUser( struct UserData *user, short id )
{
	cmess.arg1 = (ULONG)user;
	cmess.arg2 = (ULONG)id;
	CallHost( 12 );
}

UBYTE AddCharge( short n, short a )
{
	cmess.arg1 = (ULONG)n;
	cmess.arg2 = (ULONG)a;
	CallHost( 13 );
	return( (UBYTE)cmess.result );
}

UBYTE CheckBalance( short n, short a )
{
	cmess.arg1 = (ULONG)n;
	cmess.arg2 = (ULONG)a;
	CallHost( 14 );
	return( (UBYTE)cmess.result );
}

int EnterText( char a, short b )
{
	cmess.arg1 = (ULONG)a;
	cmess.arg2 = (ULONG)b;
	CallHost( 15 );
	return( (int)cmess.result );
}

long ConferenceWait( short a )
{
	cmess.arg1 = (ULONG) a;
	CallHost( 16 );
	return( (long)cmess.result );
}

void CheckChanges( void )
{
	CallHost( 17 );
}

long ConvertAccess( char *s )
{
	cmess.arg1 = (ULONG)s;
	CallHost( 18 );
	return( (long)cmess.result );
}

int GetFree( char *s, UBYTE q )
{
	cmess.arg1 = (ULONG)s;
	cmess.arg2 = (ULONG)q;
	CallHost( 19 );
	return( (int)cmess.result );
}

short FindAccount( char *a, struct UserData *b )
{
	cmess.arg1 = (ULONG)a;
	cmess.arg2 = (ULONG)b;
	CallHost( 20 );
	return( (short)cmess.result );
}

void CheckFlowControl( void )
{
	CallHost( 21 );
}

int ListDir( UBYTE a, UBYTE b, struct IsDate *c )
{
	cmess.arg1 = (ULONG)a;
	cmess.arg2 = (ULONG)b;
	cmess.arg3 = (ULONG)c;
	CallHost( 22 );
	return( (int)cmess.result );
}

UBYTE FileOLM( short a, int b )
{
	cmess.arg1 = (ULONG)a;
	cmess.arg2 = (ULONG)b;
	CallHost( 23 );
	return( (UBYTE)cmess.result );
}

UBYTE Rnext( void )
{
	CallHost( 24 );
	return( (UBYTE)cmess.result );
}

void ParseCommandLine( void )
{
	CallHost( 25 );
}

short FindCommand( short num )
{
	cmess.arg1 = (ULONG) num;
	CallHost( 26 );
	return( (short)cmess.result );
}

void ReadMessagePoint( char *a, long b )
{
	cmess.arg1 = (ULONG) a;
	cmess.arg2 = (ULONG) b;
	CallHost( 27 );
}

void EditMessage( char *file )
{
	cmess.arg1 = (ULONG) file;
	CallHost( 28 );
}

void LoadText( FILE *fp )
{
	cmess.arg1 = (ULONG) fp;
	CallHost( 29 );
}

long GrabFileSize( UBYTE quiet )
{
	cmess.arg1 = (ULONG) quiet;
	CallHost( 30 );
	return( (long)cmess.result );
}

char WaitForInput( long mics )
{
	cmess.arg1 = (ULONG) mics;
	CallHost( 31 );
	return( (char)cmess.result );
}

void AddCredits( struct ItemType *it, UBYTE justadd, short m )
{
	cmess.arg1 = (ULONG)it;
	cmess.arg2 = (ULONG)justadd;
	cmess.arg3 = (ULONG)m;
	CallHost( 33 );
}

/* some commonly used functions in CNet */

short compstra( char *s, char *t )
{
	for( ; tolower(*s) == tolower(*t); s++, t++)
		if( !*s ) return 0;

	return( (short)(tolower(*s)-tolower(*t)) );
}

UBYTE PutQ( char *a )
{
	PutText( a );
	return (UBYTE)(z->MCILine[0][0]=='1') ;
}

char *PrintAccess( int a, short n )
{
	short	i;
	static	char list[25];

	for( i=0; i<n; i++ ) {
		if ( a & 1<<i )
			list[i] = i%10+48;
		else    list[i] = '-';
	}
	list[n] = 0;

	return list;
}

void DoReturn( void )
{
	PutText("\n");
}

void PrepEditor( FILE *fp )
{
	FILE	*kp;
	char	buff[100];

	if( fp ) {
		if( kp = fopen( "_edbuff", "w" ) ) {
			while( fgets( buff, 82, fp ) && buff[0]!=26 )
				fputs( buff, kp );

			fclose( kp );
		}
	}
	else	DeleteFile( "_edbuff" );
}

void SaveEditor( FILE *fp, UBYTE eof )
{
	FILE	*kp;
	char	buff[100];

	if( kp = fopen( "_edbuff", "r" ) ) {
		while( fgets( buff, 82, kp ) && buff[0]!=26 )
		       fputs( buff, fp );

		fclose( kp );

		DeleteFile( "_edbuff" );
	}

	if( eof ) fputs( "\032\n", fp );
}
