home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
cmdsrc
/
buffers.inc
< prev
next >
Wrap
Text File
|
1990-04-29
|
5KB
|
157 lines
; BUFFERS.INC
; (c) 1989, 1990 Ashok P. Nadkarni
;
; Various definitions for string buffer structures in CMDEDIT.
;
WANT_MARKERS equ 0 ;1 if the marker routines are wanted
; 0 otherwise. Note Markers have not
; been tested and are not used in
; CMDEDIT. Keep this defined as 0.
; $STRING_STACK is a descriptor for a buffer that is maintained as a stack of
; strings. Each string has a one byte header and a one byte trailer that
; contain the length of the string. These are used to traverse up and down
; the stack allowing access to elements inside the stack. The stack grows
; upwards in memory. The string header appears at the lower address followed
; by the string itself and then the trailer.
;
; The string can be of length between 0 and 255 bytes
;
; There is a NULL string always present at the bottom of the stack. This
; consists of a 0 byte at location low followed by another 0 byte (these
; bytes are the header and trailer respectively and denote a 0 length
; string. When the stack is empty, a zero length string is returned by
; operations like popping the stack. Stack empty is true IFF
; top = cur = low+1
;
; MARKERS :
; The user can also set markers to point at the various elements in the
; stack. These markers are accessed strictly as a stack through various
; routines. When a string associated with a marker is deleted, the marker
; is set to point to the string above the deleted string except when the
; string was the topmost string in which case the marker will point to
; the new top of stack (which may even be the sentinel). Thus the markers
; will "percolate" upwards through the stack as strings are deleted until
; they reach the top. Note that if a marker points to the top of the stack,
; and a new string is pushed onto the stack, the marker still points to the
; old top of stack. When the stack is empty, any existing markers will point
; to the sentinel null string and then keep pointing there even if strings
; are added. (The strstk_purge_marks function will delete these markers).
; The marker stack is itself stored at the top of the buffer and grows
; downwards.
;
; Each element of the descriptor structure is as follows :
; low - Contains the lowest address of the buffer.
; high - Contains the highest address of the buffer.
; top - Points to the trailer of the topmost string.
; Note that this is the highest occupied location of in
; the buffer.
; cur - cur is a pointer to the "current" string within the stack.
; Most requested operations are done with respect to the
; "current" string.
; savecur - used to temporarily hold a previous value of cur while
; cur is moved around.
; topmark - location where the last marker is stored.
; = high+1 if no markers.
;
;
; For example the following diagram shows these various relationships
; and structures.
;
; Assuming the buffer contains two strings and a single mark pointing
; to the first string,
;
; Descriptor Buffer (range 100h - 10F)
; +---------------+
; low = 100h 10F | 01h |
; +---------------+
; high = 10Fh 10E | 05h |
; +---------------+
; top = 10Ah 10D | - |
; +---------------+
; topmark = 10Eh 10C | - |
; +---------------+
; 10B | - |
; +---------------+
; 10A | Len(B)=3 |
; +---------------+
; 109 | b3 |
; +---------------+
; 108 | b2 |
; +---------------+
; 107 | b1 |
; +---------------+
; 106 | Len(B)=3 |
; +---------------+
; 105 | Len(A)=2 |
; +---------------+
; 104 | a2 |
; +---------------+
; 103 | a1 |
; +---------------+
; 102 | Len(A)=2 |
; +---------------+
; 101 | 0 |
; +---------------+
; 100 | 0 |
; +---------------+
;
; The functions defined for these buffers make specific assumptions about
; how these are manipulated so the user code should NOT write to them directly.
;
$string_stack STRUC
top dw ?
cur dw ?
savecur dw ?
low_end dw ?
high_end dw ?
topmark dw ? ;This field must be present
; even if WANT_MARKERS is 0
$string_stack ENDS
IFDEF STRSTACK_ASM
PUBLIC strstk_init
PUBLIC strstk_reset
PUBLIC strstk_push
PUBLIC strstk_makespace
PUBLIC strstk_space
PUBLIC strstk_fwd_match
PUBLIC strstk_bck_match
PUBLIC strstk_fwd_find
PUBLIC strstk_bck_find
PUBLIC strstk_settop
PUBLIC strstk_setbot
PUBLIC strstk_kill
PUBLIC strstk_copy
PUBLIC strstk_compare
PUBLIC strstk_prefix
PUBLIC strstk_save_cur
PUBLIC strstk_restore_cur
ELSE
CSEG SEGMENT PARA PUBLIC 'CODE'
EXTRN strstk_init:PROC
EXTRN strstk_reset:PROC
EXTRN strstk_push:PROC
EXTRN strstk_makespace:PROC
EXTRN strstk_space:PROC
EXTRN strstk_fwd_match:PROC
EXTRN strstk_bck_match:PROC
EXTRN strstk_fwd_find:PROC
EXTRN strstk_bck_find:PROC
EXTRN strstk_settop:PROC
EXTRN strstk_setbot:PROC
EXTRN strstk_kill:PROC
EXTRN strstk_copy:PROC
EXTRN strstk_compare:PROC
EXTRN strstk_prefix:PROC
EXTRN strstk_save_cur:PROC
EXTRN strstk_restore_cur:PROC
CSEG ENDS
ENDIF