home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
074.lha
/
AssignDevice
/
misc.c
< prev
Wrap
C/C++ Source or Header
|
1986-11-20
|
7KB
|
326 lines
/* misc.c
* Misc. subroutines that like to live together...
*
* Phillip Lindsay (c) 1987 Commodore-Amiga - This code may be freely used
* as long as the copyright notice is left intact.
*/
#include <exec/types.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <exec/memory.h>
#include <exec/ports.h>
#include <exec/libraries.h>
#include <exec/devices.h>
#include <exec/io.h>
#include <devices/console.h>
#include <intuition/intuition.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <libraries/filehandler.h>
#ifdef AZTEC_C
#include <functions.h>
#endif
#define MKBPTR(x) ((BPTR)((long)x >> 2))
/* btoc() takes a pointer to a BSTR and converts it to a
* C string.
*/
char *btoc(bstring)
CPTR bstring;
{
register UBYTE len,count,*cstring=NULL;
if(bstring)
{
cstring = (UBYTE *) bstring;
len = cstring[0];
for(count=0;count < len;count++)
cstring[count] = cstring[count+1];
cstring[count] = '\0';
}
return((char *)cstring);
}
/* ctob() takes a pointer to a C string and converts
* it to a BSTR.
*/
BSTR ctob(cstring)
UBYTE *cstring;
{
extern UBYTE strlen();
register UBYTE len,count;
if(cstring)
{
len = strlen(cstring);
for(count=len;count > (UBYTE)0;count--)
cstring[count] = cstring[count-1];
cstring[count] = len;
}
return((BSTR)MKBPTR(cstring));
}
/*
* memcpy() - fast "C" byte memory copy.
*/
VOID memcpy(source,dest,size)
UBYTE *source,*dest;
ULONG size;
{
register UBYTE *msource=source,
*mdest=dest;
register ULONG msize=size;
if(msize)
{
do { *mdest++ = *msource++; } while(--msize);
}
}
/*
* memfill() - fill memory with supplied byte value for "size" bytes
*/
VOID memfill(source,size,value)
UBYTE *source;
ULONG size;
UBYTE value;
{
register UBYTE *msource=source,
mvalue=value,
*mend;
for(mend = &source[size]; msource < mend ;msource++)
*msource = mvalue;
}
/*
* strupper() - return given string in upper case;
*
*/
char *strupper(astring)
char *astring;
{
register char *astr = astring;
if(astr)
{
do
{
*astr = toupper(*astr);
} while(*astr++);
}
return(astring);
}
/*
* trunc() - truncate string at specified character
*
*/
VOID trunc(astring,acharacter)
char *astring,acharacter;
{
register char *astr=astring,achar=acharacter;
do
{
if( *astr == achar )
{
*astr = '\0';
break;
}
} while(*astr++);
}
/*
* allocstr() - copies a string into a newly allocated memory space.
*
*/
char *allocstr(astring,length)
char *astring;
ULONG length;
{
register char *astr=astring,
*newstr=NULL;
register ULONG slength=length;
if( (astr) && (slength) )
{
if( ( newstr = ( char * ) AllocMem( slength, MEMF_PUBLIC) ) )
memcpy(astr,newstr,slength);
}
return(newstr);
}
#define KEYWORD ( (ULONG) ('C' << 24) | ('O' << 16) | ('P' << 8) | ('Y') )
/*
* check to see if device node was created by dupdev().
*/
BOOL ourdevnode(dnode)
struct DeviceNode *dnode;
{
register UBYTE length;
char *bname;
ULONG key;
bname = (char *) BADDR(dnode->dn_Name);
length = (UBYTE) bname[0] + 1;
key = KEYWORD;
return( (BOOL) ( !strncmp(&key,&bname[length],(ULONG)sizeof(ULONG)) ? TRUE :
FALSE ) );
}
/*
* free memory we allocated for duplicate device node.
*/
VOID freedev(dnode)
struct DeviceNode *dnode;
{
register char *devname;
register UBYTE length;
if(dnode->dn_Name)
{
devname = btoc( BADDR(dnode->dn_Name) );
length = (UBYTE) strlen(devname);
length += 5;
FreeMem(devname,(ULONG) length);
}
FreeMem( dnode, (ULONG) sizeof(*dnode) );
}
/*
* Add a dos node to the system device list
*
*/
VOID adddosnode(adnode)
struct DeviceNode *adnode;
{
extern struct DosLibrary *DOSBase;
register struct RootNode *rnode;
register struct DosInfo *dinfo;
register struct DeviceNode *dnode;
rnode = (struct RootNode *) DOSBase->dl_Root; /* find root node */
dinfo = (struct DosInfo *) BADDR(rnode->rn_Info); /* now dos info */
adnode->dn_Next = NULL;
Forbid();
for(dnode = (struct DeviceNode *) BADDR(dinfo->di_DevInfo);dnode->dn_Next;
dnode = (struct DeviceNode *) BADDR(dnode->dn_Next))
; /* do nothing but traverse the list */
dnode->dn_Next = MKBPTR(adnode);
Permit();
}
/*
* find a dos node in the system device list
*
*/
BOOL finddosnode(lookfor)
char *lookfor;
{
extern struct DosLibrary *DOSBase;
register struct RootNode *rnode;
register struct DosInfo *dinfo;
register struct DeviceNode *dnode;
register char *bname;
char name1[81];
char name2[81];
BOOL found = FALSE;
rnode = (struct RootNode *) DOSBase->dl_Root; /* find root node */
dinfo = (struct DosInfo *) BADDR(rnode->rn_Info); /* now dos info */
strcpy(name1,lookfor);
strupper(name1);
Forbid();
for(dnode = (struct DeviceNode *) BADDR(dinfo->di_DevInfo); ( dnode ) ;
dnode = (struct DeviceNode *) BADDR(dnode->dn_Next))
{
bname = (char *) BADDR(dnode->dn_Name);
memcpy(bname, name2, (ULONG)( bname[0] + 1 ) );
if( !( strcmp( name1, strupper(btoc(name2)) ) ) )
{
found = TRUE;
break;
}
}
Permit();
return(found);
}
/*
* Duplicate the given device node and add it the system device list.
*/
VOID dupdev(dnode,newname)
struct DeviceNode *dnode;
char *newname;
{
register struct DeviceNode *newdnode;
register BSTR newbname;
register UBYTE length;
char tmpname[81];
ULONG tmplong;
newdnode = (struct DeviceNode *)
AllocMem( (ULONG) sizeof(*newdnode), MEMF_PUBLIC | MEMF_CLEAR );
memcpy(dnode,newdnode,(ULONG)sizeof(*newdnode));
newdnode->dn_Name = NULL;
strcpy(tmpname,newname);
length = (UBYTE) strlen(tmpname);
tmplong = KEYWORD;
memcpy(&tmplong,&tmpname[length+1], (ULONG) sizeof(ULONG) );
length += 5; /* include NULL and LONG WORD */
newbname = ctob( allocstr(tmpname, (ULONG) length) );
newdnode->dn_Next = NULL;
if(!newbname)
freedev(newdnode);
else
{
newdnode->dn_Name = newbname;
adddosnode(newdnode);
}
}
/* end of misc.c */