mirror of https://github.com/zrafa/xinu-avr.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.1 KiB
140 lines
4.1 KiB
/* nammap.c - nammap, namrepl, namcpy */ |
|
|
|
#include <xinu.h> |
|
|
|
status namcpy(char *, char *, int32); |
|
did32 namrepl(char *, char[]); |
|
|
|
/*------------------------------------------------------------------------ |
|
* nammap - Using namespace, map name to new name and new device |
|
*------------------------------------------------------------------------ |
|
*/ |
|
devcall nammap( |
|
char *name, /* The name to map */ |
|
char newname[NM_MAXLEN], /* Buffer for mapped name */ |
|
did32 namdev /* ID of the namespace device */ |
|
) |
|
{ |
|
did32 newdev; /* Device descriptor to return */ |
|
char tmpname[NM_MAXLEN]; /* Temporary buffer for name */ |
|
int32 iter; /* Number of iterations */ |
|
|
|
//RAFA |
|
// kprintf("no:%s", name); |
|
/* Place original name in temporary buffer and null terminate */ |
|
|
|
if (namcpy(tmpname, name, NM_MAXLEN) == SYSERR) { |
|
return SYSERR; |
|
} |
|
|
|
/* Repeatedly substitute the name prefix until a non-namespace */ |
|
/* device is reached or an iteration limit is exceeded */ |
|
|
|
|
|
for (iter=0; iter<nnames ; iter++) { |
|
newdev = namrepl(tmpname, newname); |
|
if (newdev != namdev) { |
|
return newdev; /* Either valid ID or SYSERR */ |
|
} |
|
namcpy(tmpname, newname, NM_MAXLEN); |
|
} |
|
return SYSERR; |
|
} |
|
|
|
/*------------------------------------------------------------------------ |
|
* namrepl - Use the name table to perform prefix substitution |
|
*------------------------------------------------------------------------ |
|
*/ |
|
did32 namrepl( |
|
char *name, /* Original name */ |
|
char newname[NM_MAXLEN] /* Buffer for mapped name */ |
|
) |
|
{ |
|
int32 i; /* Iterate through name table */ |
|
char *pptr; /* Walks through a prefix */ |
|
char *rptr; /* Walks through a replacement */ |
|
char *optr; /* Walks through original name */ |
|
char *nptr; /* Walks through new name */ |
|
char olen; /* Length of original name */ |
|
/* including the NULL byte */ |
|
int32 plen; /* Length of a prefix string */ |
|
/* *not* including NULL byte */ |
|
int32 rlen; /* Length of replacment string */ |
|
int32 remain; /* Bytes in name beyond prefix */ |
|
struct nmentry *namptr; /* Pointer to a table entry */ |
|
|
|
/* Search name table for first prefix that matches */ |
|
|
|
for (i=0; i<nnames; i++) { |
|
namptr = &nametab[i]; |
|
optr = name; /* Start at beginning of name */ |
|
pptr = namptr->nprefix; /* Start at beginning of prefix */ |
|
// RAFA |
|
// kprintf("pr:%s", pptr); |
|
|
|
/* Compare prefix to string and count prefix size */ |
|
|
|
for (plen=0; *pptr != NULLCH ; plen++) { |
|
if (*pptr != *optr) { |
|
break; |
|
} |
|
pptr++; |
|
optr++; |
|
} |
|
if (*pptr != NULLCH) { /* Prefix does not match */ |
|
continue; |
|
} |
|
|
|
/* Found a match - check that replacement string plus */ |
|
/* bytes remaining at the end of the original name will */ |
|
/* fit into new name buffer. Ignore null on replacement*/ |
|
/* string, but keep null on remainder of name. */ |
|
|
|
olen = namlen(name ,NM_MAXLEN); |
|
rlen = namlen(namptr->nreplace,NM_MAXLEN) - 1; |
|
remain = olen - plen; |
|
if ( (rlen + remain) > NM_MAXLEN) { |
|
return (did32)SYSERR; |
|
} |
|
|
|
/* Place replacement string followed by remainder of */ |
|
/* original name (and null) into the new name buffer */ |
|
|
|
|
|
nptr = newname; |
|
rptr = namptr->nreplace; |
|
for (; rlen>0 ; rlen--) { |
|
*nptr++ = *rptr++; |
|
} |
|
for (; remain>0 ; remain--) { |
|
*nptr++ = *optr++; |
|
} |
|
return namptr->ndevice; |
|
} |
|
return (did32)SYSERR; |
|
} |
|
|
|
/*------------------------------------------------------------------------ |
|
* namcpy - Copy a name from one buffer to another, checking length |
|
*------------------------------------------------------------------------ |
|
*/ |
|
status namcpy( |
|
char *newname, /* Buffer to hold copy */ |
|
char *oldname, /* Buffer containing name */ |
|
int32 buflen /* Size of buffer for copy */ |
|
) |
|
{ |
|
char *nptr; /* Point to new name */ |
|
char *optr; /* Point to old name */ |
|
int32 cnt; /* Count of characters copied */ |
|
|
|
nptr = newname; |
|
optr = oldname; |
|
|
|
for (cnt=0; cnt<buflen; cnt++) { |
|
if ( (*nptr++ = *optr++) == NULLCH) { |
|
return OK; |
|
} |
|
} |
|
return SYSERR; /* Buffer filled before copy completed */ |
|
}
|
|
|