|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T g ┃
Length: 2500 (0x9c4) Types: TextFile Names: »gpa.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/euug-87hel/sec8/mcp/src/gpa.c«
/***************************************************************************\ * * * gpa.c * * * * These are the support routines for the global_pointer_array that all * * routines that get input from the tty use, excluding main(). * * * * Routines needing an argv like array to store pointers call get_gpa() * * which returns a pointer to chunk of the global_pointer_array of the * * requested size. Such a central array is needed to insure that all * * allocations via savestr() in get_line() are freed by a call to * * free_gpa(). This is insured even from interrupts by always calling * * free_gpa() in main() before getting the next command line. * * * * clear_gpa() is used by routines that already have made a call to * * get_gpa() and want to reuse the space provided, but need to be sure that * * any leftover pointers freed before they are overwritten. * * * * ---------- * * * * get_gpa() get a chunk of the global_pointer_array * * * * clear_gpa() free the pointers stored in a certian part * * of the array for reuse. * * * * free_gpa() free all pointers in the global_pointer_array * * and reset the array index to zero. * * * * pop_gpa() used to free last allocated part of the * * global_pointer_array. Designed for use by routines * * in yesno.c. No other routines should need call this. * * * \***************************************************************************/ #include "sysdep.h" #include "mem.h" #include "gpa.h" static addr global_pointer_array[G_P_A__SIZE]; static int gpaindex; addr * get_gpa(n) int n; { gpaindex += n; return &global_pointer_array[gpaindex-n]; } free_gpa() { int i; critical(); for (i=0; i<G_P_A__SIZE; i++) if (global_pointer_array[i]) { FREEMEM((char *)global_pointer_array[i]); global_pointer_array[i] = NIL; } gpaindex = 0; non_critical(); return; } int clear_gpa(p, n) addr *p; int n; { register int i; for (i=0; i<n; i++) if (p[i]) { /* * Can't let user interrupt between the FREEMEM * and zeroing the pointer. */ critical(); FREEMEM((char *)p[i]); p[i] = NIL; non_critical(); } return 1; /* used as do-while constant */ } pop_gpa(n) int n; { (void) clear_gpa(&global_pointer_array[gpaindex-n], n); gpaindex -= n; return; }