Category : Miscellaneous Language Source Code
Archive   : E!518.ZIP
Filename : API.C

 
Output of file : API.C contained in archive : E!518.ZIP

/******************************************************************************/
/* E! API management functions */
/******************************************************************************/

#include
#include
#include "api.h"

/******************************************************************************/
/* This global variable is initialized to the default value used by E! to */
/* install the API interrupt handler. This value may be changed dynamical- */
/* ly using a Profile. So the API program must also change the interrupt */
/* number. */
/******************************************************************************/
int E_Vec = 0xC0;

/**************************************************/
/* Call E! function #funcno and return error code */
/**************************************************/
char Call_E_Function ( unsigned funcno )


{
union REGS regs;

regs.h.ah = 0;
regs.x.bx = funcno;
int86(E_Vec, ®s, ®s);
return ( regs.h.al );
}

/******************************************************************************/
/* Returns a FAR pointer to the requested variables block */
/******************************************************************************/
void far *Request_E_Address ( char request_name )

{
union REGS regs;
struct SREGS sregs;

if ((request_name < 1) || ((request_name > 7) && (request_name < 20)) || (request_name > 21))
return (NULL);
regs.h.ah = request_name;
int86x(E_Vec, ®s, ®s, &sregs);
return ( MK_FP (sregs.es, regs.x.bx) );
}

/******************************************************************************/
/* Loads status members with appropriate values */
/******************************************************************************/
void Get_E_Status ( STATUSRECORD *status)

{
union REGS regs;

regs.h.ah = STATUS_REQUEST;
int86(E_Vec, ®s, ®s);
status->linenum = regs.x.cx;
status->line = regs.x.dx;
status->col = regs.h.ah;
status->firstcol= regs.h.al;
status->lower = regs.h.bh;
status->nbwin = regs.h.bl;
}

/******************************************************************************/
/* Request a special E! API service */
/******************************************************************************/
void Request_E_Service ( char service)

{
union REGS regs;

regs.h.ah = service;
int86(E_Vec, ®s, ®s);
}

/******************************************************************************/
/* Get E! version number */
/******************************************************************************/
void Get_E_Version ( char *major, char *minor)

{
union REGS regs;

regs.h.ah = VERSION_SERVICE;
int86(E_Vec, ®s, ®s);
*major = regs.h.ah;
*minor = regs.h.al;
}

/******************************************************************************/
/* Instruct E! to execute a command on return */
/******************************************************************************/
void RegisterCommand ( commandline commandstr )

{
union REGS regs;
struct SREGS sregs;

regs.h.ah = REGISTER_SERVICE;
sregs.es = FP_SEG ( commandstr );
regs.x.bx = FP_OFF ( commandstr );
int86x(E_Vec, ®s, ®s, &sregs);
}

/******************************************************************************/
/* Call E! seek function and return error code */
/******************************************************************************/

char Seek_E_Line ( unsigned line, char curpos)

{
union REGS regs;

regs.h.ah = SEEK_SERVICE;
regs.x.bx = line;
regs.h.al = curpos;
int86(E_Vec, ®s, ®s);
return (regs.h.al);
}

/******************************************************************************/
/* Instruct E! to allocate memory on its own heap for the program. */
/******************************************************************************/
BOOL Get_E_Memory( unsigned paragraphs,
unsigned memID,
void **blockptr, /* blockptr is a pointer to a far pointer */
BOOL *firsttime) /* that is, it's the address of the pointer */
/* to the variables block. */

{
union REGS regs;
struct SREGS sregs;

regs.h.ah = GETMEM_SERVICE;
regs.x.dx = memID;
regs.x.cx = paragraphs;
int86x(E_Vec, ®s, ®s, &sregs);
*blockptr = regs.h.al == 0 ? MK_FP (sregs.es, regs.x.bx) : NULL;
*firsttime = regs.h.ah;
return (regs.h.al ^ 0xff);
}

/******************************************************************************/
/* Free memory on E! heap */
/******************************************************************************/
BOOL Free_E_Memory ( unsigned memID )

{
union REGS regs;

regs.h.ah = FREEMEM_SERVICE;
regs.x.dx = memID;
int86(E_Vec, ®s, ®s);
return (regs.h.al ^ 0xff);
}

BOOL getflagstatus (unsigned flagid)

{
union REGS regs;

regs.h.ah = flagid;
int86(E_Vec, ®s, ®s);
return (regs.h.al);
}

/******************************************************************************/
/* Is E! idle ? */
/******************************************************************************/
BOOL Is_E_Idle ()

{
return ( getflagstatus (E_IDLE_SERVICE) );
}

/******************************************************************************/
/* Was the file modified ? */
/******************************************************************************/
BOOL Is_File_Modified ()

{
return ( getflagstatus (MODIF_SERVICE) );
}