Changeset View
Changeset View
Standalone View
Standalone View
head/contrib/less/ifile.c
Show First 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | |||||
/* | /* | ||||
* Anchor for linked list. | * Anchor for linked list. | ||||
*/ | */ | ||||
static struct ifile anchor = { &anchor, &anchor, NULL, NULL, 0, 0, '\0', | static struct ifile anchor = { &anchor, &anchor, NULL, NULL, 0, 0, '\0', | ||||
{ NULL_POSITION, 0 } }; | { NULL_POSITION, 0 } }; | ||||
static int ifiles = 0; | static int ifiles = 0; | ||||
static void | static void | ||||
incr_index(p, incr) | incr_index(struct ifile *p, int incr) | ||||
register struct ifile *p; | |||||
int incr; | |||||
{ | { | ||||
for (; p != &anchor; p = p->h_next) | for (; p != &anchor; p = p->h_next) | ||||
p->h_index += incr; | p->h_index += incr; | ||||
} | } | ||||
/* | /* | ||||
* Link an ifile into the ifile list. | * Link an ifile into the ifile list. | ||||
*/ | */ | ||||
static void | static void | ||||
link_ifile(p, prev) | link_ifile(struct ifile *p, struct ifile *prev) | ||||
struct ifile *p; | |||||
struct ifile *prev; | |||||
{ | { | ||||
/* | /* | ||||
* Link into list. | * Link into list. | ||||
*/ | */ | ||||
if (prev == NULL) | if (prev == NULL) | ||||
prev = &anchor; | prev = &anchor; | ||||
p->h_next = prev->h_next; | p->h_next = prev->h_next; | ||||
p->h_prev = prev; | p->h_prev = prev; | ||||
prev->h_next->h_prev = p; | prev->h_next->h_prev = p; | ||||
prev->h_next = p; | prev->h_next = p; | ||||
/* | /* | ||||
* Calculate index for the new one, | * Calculate index for the new one, | ||||
* and adjust the indexes for subsequent ifiles in the list. | * and adjust the indexes for subsequent ifiles in the list. | ||||
*/ | */ | ||||
p->h_index = prev->h_index + 1; | p->h_index = prev->h_index + 1; | ||||
incr_index(p->h_next, 1); | incr_index(p->h_next, 1); | ||||
ifiles++; | ifiles++; | ||||
} | } | ||||
/* | /* | ||||
* Unlink an ifile from the ifile list. | * Unlink an ifile from the ifile list. | ||||
*/ | */ | ||||
static void | static void | ||||
unlink_ifile(p) | unlink_ifile(struct ifile *p) | ||||
struct ifile *p; | |||||
{ | { | ||||
p->h_next->h_prev = p->h_prev; | p->h_next->h_prev = p->h_prev; | ||||
p->h_prev->h_next = p->h_next; | p->h_prev->h_next = p->h_next; | ||||
incr_index(p->h_next, -1); | incr_index(p->h_next, -1); | ||||
ifiles--; | ifiles--; | ||||
} | } | ||||
/* | /* | ||||
* Allocate a new ifile structure and stick a filename in it. | * Allocate a new ifile structure and stick a filename in it. | ||||
* It should go after "prev" in the list | * It should go after "prev" in the list | ||||
* (or at the beginning of the list if "prev" is NULL). | * (or at the beginning of the list if "prev" is NULL). | ||||
* Return a pointer to the new ifile structure. | * Return a pointer to the new ifile structure. | ||||
*/ | */ | ||||
static struct ifile * | static struct ifile * | ||||
new_ifile(filename, prev) | new_ifile(char *filename, struct ifile *prev) | ||||
char *filename; | |||||
struct ifile *prev; | |||||
{ | { | ||||
register struct ifile *p; | struct ifile *p; | ||||
/* | /* | ||||
* Allocate and initialize structure. | * Allocate and initialize structure. | ||||
*/ | */ | ||||
p = (struct ifile *) ecalloc(1, sizeof(struct ifile)); | p = (struct ifile *) ecalloc(1, sizeof(struct ifile)); | ||||
p->h_filename = save(filename); | p->h_filename = save(filename); | ||||
p->h_scrpos.pos = NULL_POSITION; | p->h_scrpos.pos = NULL_POSITION; | ||||
p->h_opened = 0; | p->h_opened = 0; | ||||
p->h_hold = 0; | p->h_hold = 0; | ||||
p->h_filestate = NULL; | p->h_filestate = NULL; | ||||
link_ifile(p, prev); | link_ifile(p, prev); | ||||
return (p); | return (p); | ||||
} | } | ||||
/* | /* | ||||
* Delete an existing ifile structure. | * Delete an existing ifile structure. | ||||
*/ | */ | ||||
public void | public void | ||||
del_ifile(h) | del_ifile(IFILE h) | ||||
IFILE h; | |||||
{ | { | ||||
register struct ifile *p; | struct ifile *p; | ||||
if (h == NULL_IFILE) | if (h == NULL_IFILE) | ||||
return; | return; | ||||
/* | /* | ||||
* If the ifile we're deleting is the currently open ifile, | * If the ifile we're deleting is the currently open ifile, | ||||
* move off it. | * move off it. | ||||
*/ | */ | ||||
unmark(h); | unmark(h); | ||||
if (h == curr_ifile) | if (h == curr_ifile) | ||||
curr_ifile = getoff_ifile(curr_ifile); | curr_ifile = getoff_ifile(curr_ifile); | ||||
p = int_ifile(h); | p = int_ifile(h); | ||||
unlink_ifile(p); | unlink_ifile(p); | ||||
free(p->h_filename); | free(p->h_filename); | ||||
free(p); | free(p); | ||||
} | } | ||||
/* | /* | ||||
* Get the ifile after a given one in the list. | * Get the ifile after a given one in the list. | ||||
*/ | */ | ||||
public IFILE | public IFILE | ||||
next_ifile(h) | next_ifile(IFILE h) | ||||
IFILE h; | |||||
{ | { | ||||
register struct ifile *p; | struct ifile *p; | ||||
p = (h == NULL_IFILE) ? &anchor : int_ifile(h); | p = (h == NULL_IFILE) ? &anchor : int_ifile(h); | ||||
if (p->h_next == &anchor) | if (p->h_next == &anchor) | ||||
return (NULL_IFILE); | return (NULL_IFILE); | ||||
return (ext_ifile(p->h_next)); | return (ext_ifile(p->h_next)); | ||||
} | } | ||||
/* | /* | ||||
* Get the ifile before a given one in the list. | * Get the ifile before a given one in the list. | ||||
*/ | */ | ||||
public IFILE | public IFILE | ||||
prev_ifile(h) | prev_ifile(IFILE h) | ||||
IFILE h; | |||||
{ | { | ||||
register struct ifile *p; | struct ifile *p; | ||||
p = (h == NULL_IFILE) ? &anchor : int_ifile(h); | p = (h == NULL_IFILE) ? &anchor : int_ifile(h); | ||||
if (p->h_prev == &anchor) | if (p->h_prev == &anchor) | ||||
return (NULL_IFILE); | return (NULL_IFILE); | ||||
return (ext_ifile(p->h_prev)); | return (ext_ifile(p->h_prev)); | ||||
} | } | ||||
/* | /* | ||||
* Return a different ifile from the given one. | * Return a different ifile from the given one. | ||||
*/ | */ | ||||
public IFILE | public IFILE | ||||
getoff_ifile(ifile) | getoff_ifile(IFILE ifile) | ||||
IFILE ifile; | |||||
{ | { | ||||
IFILE newifile; | IFILE newifile; | ||||
if ((newifile = prev_ifile(ifile)) != NULL_IFILE) | if ((newifile = prev_ifile(ifile)) != NULL_IFILE) | ||||
return (newifile); | return (newifile); | ||||
if ((newifile = next_ifile(ifile)) != NULL_IFILE) | if ((newifile = next_ifile(ifile)) != NULL_IFILE) | ||||
return (newifile); | return (newifile); | ||||
return (NULL_IFILE); | return (NULL_IFILE); | ||||
} | } | ||||
/* | /* | ||||
* Return the number of ifiles. | * Return the number of ifiles. | ||||
*/ | */ | ||||
public int | public int | ||||
nifile() | nifile(void) | ||||
{ | { | ||||
return (ifiles); | return (ifiles); | ||||
} | } | ||||
/* | /* | ||||
* Find an ifile structure, given a filename. | * Find an ifile structure, given a filename. | ||||
*/ | */ | ||||
static struct ifile * | static struct ifile * | ||||
find_ifile(filename) | find_ifile(char *filename) | ||||
char *filename; | |||||
{ | { | ||||
register struct ifile *p; | struct ifile *p; | ||||
for (p = anchor.h_next; p != &anchor; p = p->h_next) | for (p = anchor.h_next; p != &anchor; p = p->h_next) | ||||
if (strcmp(filename, p->h_filename) == 0) | if (strcmp(filename, p->h_filename) == 0) | ||||
return (p); | return (p); | ||||
return (NULL); | return (NULL); | ||||
} | } | ||||
/* | /* | ||||
* Get the ifile associated with a filename. | * Get the ifile associated with a filename. | ||||
* If the filename has not been seen before, | * If the filename has not been seen before, | ||||
* insert the new ifile after "prev" in the list. | * insert the new ifile after "prev" in the list. | ||||
*/ | */ | ||||
public IFILE | public IFILE | ||||
get_ifile(filename, prev) | get_ifile(char *filename, IFILE prev) | ||||
char *filename; | |||||
IFILE prev; | |||||
{ | { | ||||
register struct ifile *p; | struct ifile *p; | ||||
if ((p = find_ifile(filename)) == NULL) | if ((p = find_ifile(filename)) == NULL) | ||||
p = new_ifile(filename, int_ifile(prev)); | p = new_ifile(filename, int_ifile(prev)); | ||||
return (ext_ifile(p)); | return (ext_ifile(p)); | ||||
} | } | ||||
/* | /* | ||||
* Get the filename associated with a ifile. | * Get the filename associated with a ifile. | ||||
*/ | */ | ||||
public char * | public char * | ||||
get_filename(ifile) | get_filename(IFILE ifile) | ||||
IFILE ifile; | |||||
{ | { | ||||
if (ifile == NULL) | if (ifile == NULL) | ||||
return (NULL); | return (NULL); | ||||
return (int_ifile(ifile)->h_filename); | return (int_ifile(ifile)->h_filename); | ||||
} | } | ||||
/* | /* | ||||
* Get the index of the file associated with a ifile. | * Get the index of the file associated with a ifile. | ||||
*/ | */ | ||||
public int | public int | ||||
get_index(ifile) | get_index(IFILE ifile) | ||||
IFILE ifile; | |||||
{ | { | ||||
return (int_ifile(ifile)->h_index); | return (int_ifile(ifile)->h_index); | ||||
} | } | ||||
/* | /* | ||||
* Save the file position to be associated with a given file. | * Save the file position to be associated with a given file. | ||||
*/ | */ | ||||
public void | public void | ||||
store_pos(ifile, scrpos) | store_pos(IFILE ifile, struct scrpos *scrpos) | ||||
IFILE ifile; | |||||
struct scrpos *scrpos; | |||||
{ | { | ||||
int_ifile(ifile)->h_scrpos = *scrpos; | int_ifile(ifile)->h_scrpos = *scrpos; | ||||
} | } | ||||
/* | /* | ||||
* Recall the file position associated with a file. | * Recall the file position associated with a file. | ||||
* If no position has been associated with the file, return NULL_POSITION. | * If no position has been associated with the file, return NULL_POSITION. | ||||
*/ | */ | ||||
public void | public void | ||||
get_pos(ifile, scrpos) | get_pos(IFILE ifile, struct scrpos *scrpos) | ||||
IFILE ifile; | |||||
struct scrpos *scrpos; | |||||
{ | { | ||||
*scrpos = int_ifile(ifile)->h_scrpos; | *scrpos = int_ifile(ifile)->h_scrpos; | ||||
} | } | ||||
/* | /* | ||||
* Mark the ifile as "opened". | * Mark the ifile as "opened". | ||||
*/ | */ | ||||
public void | public void | ||||
set_open(ifile) | set_open(IFILE ifile) | ||||
IFILE ifile; | |||||
{ | { | ||||
int_ifile(ifile)->h_opened = 1; | int_ifile(ifile)->h_opened = 1; | ||||
} | } | ||||
/* | /* | ||||
* Return whether the ifile has been opened previously. | * Return whether the ifile has been opened previously. | ||||
*/ | */ | ||||
public int | public int | ||||
opened(ifile) | opened(IFILE ifile) | ||||
IFILE ifile; | |||||
{ | { | ||||
return (int_ifile(ifile)->h_opened); | return (int_ifile(ifile)->h_opened); | ||||
} | } | ||||
public void | public void | ||||
hold_ifile(ifile, incr) | hold_ifile(IFILE ifile, int incr) | ||||
IFILE ifile; | |||||
int incr; | |||||
{ | { | ||||
int_ifile(ifile)->h_hold += incr; | int_ifile(ifile)->h_hold += incr; | ||||
} | } | ||||
public int | public int | ||||
held_ifile(ifile) | held_ifile(IFILE ifile) | ||||
IFILE ifile; | |||||
{ | { | ||||
return (int_ifile(ifile)->h_hold); | return (int_ifile(ifile)->h_hold); | ||||
} | } | ||||
public void * | public void * | ||||
get_filestate(ifile) | get_filestate(IFILE ifile) | ||||
IFILE ifile; | |||||
{ | { | ||||
return (int_ifile(ifile)->h_filestate); | return (int_ifile(ifile)->h_filestate); | ||||
} | } | ||||
public void | public void | ||||
set_filestate(ifile, filestate) | set_filestate(IFILE ifile, void *filestate) | ||||
IFILE ifile; | |||||
void *filestate; | |||||
{ | { | ||||
int_ifile(ifile)->h_filestate = filestate; | int_ifile(ifile)->h_filestate = filestate; | ||||
} | } | ||||
#if 0 | #if 0 | ||||
public void | public void | ||||
if_dump() | if_dump(void) | ||||
{ | { | ||||
register struct ifile *p; | struct ifile *p; | ||||
for (p = anchor.h_next; p != &anchor; p = p->h_next) | for (p = anchor.h_next; p != &anchor; p = p->h_next) | ||||
{ | { | ||||
printf("%x: %d. <%s> pos %d,%x\n", | printf("%x: %d. <%s> pos %d,%x\n", | ||||
p, p->h_index, p->h_filename, | p, p->h_index, p->h_filename, | ||||
p->h_scrpos.ln, p->h_scrpos.pos); | p->h_scrpos.ln, p->h_scrpos.pos); | ||||
ch_dump(p->h_filestate); | ch_dump(p->h_filestate); | ||||
} | } | ||||
} | } | ||||
#endif | #endif |