V10/netfs/libnetb/tag.c
/*
* manage a simple symbol table
*
* _rfnewtag(t, f)
* enter Rfile *f with tag t
* _rfdeltag(t)
* remove entry with tag t
* _rftagtof(t)
* return f for tag t
* _rfdeltag returns 1 for OK, 0 for error
* _rfnewtag returns f, or the old f if tag was already in use
* (dup tag, no tag to delete, no room for more tags)
*/
#include "rf.h"
#include "tag.h"
#define NULL 0
struct tagp {
Tag tag;
Rfile *f;
};
#define NTAG 100
static struct tagp tags[NTAG];
Rfile *
_rftagtof(t)
register Tag t;
{
register struct tagp *tp;
register int i;
for (tp = tags, i = 0; i < NTAG; tp++, i++)
if (tp->f && tp->tag == t)
return (tp->f);
return (NULL);
}
Rfile *
_rfnewtag(t, f)
register Tag t;
Rfile *f;
{
register struct tagp *tp;
register int i;
register struct tagp *ep;
ep = NULL;
for (tp = tags, i = 0; i < NTAG; tp++, i++) {
if (tp->f) {
if (tp->tag == t)
return (tp->f); /* dup tag */
continue;
}
if (ep == NULL)
ep = tp;
}
if (ep == NULL)
return (NULL);
ep->tag = t;
ep->f = f;
return (f);
}
_rfdeltag(t)
register Tag t;
{
register struct tagp *tp;
register int i;
for (tp = tags, i = 0; i < NTAG; tp++, i++)
if (tp->f && tp->tag == t) {
tp->f = NULL;
return (1);
}
return (0);
}