(Updated August 13, 1999)
My library software follows certain conventions that you might find useful to know when using or examining the software:
obj_util.c
") is
a package of functions that operate on a particular type of object;
e.g., a network connection, a hash table, etc. Associated with each
package is a header file ("obj_util.h
") which
defines an opaque handle for objects of the given type, any global
variables, and function prototypes for public functions in the package.
objCreate()
creates a particular type of object
and returns a handle that is passed to other functions in the package.
objDestroy()
destroys an object.
objAdd()
and objDelete()
are used to add and delete items in a container object; e.g.,
elements of a list, entries in a hash table, etc.
objOpen()
and objClose()
create and destroy, respectively, objects of the given type.
objFd()
returns the underlying UNIX file
descriptor for an I/O object.
objIsReadable()
,
objIsWriteable()
, and
objIsUp()
poll an I/O object.
objName()
returns the name of an I/O object.
objRead()
and objWrite()
perform actual I/O on an object.
EINVAL
indicates
an invalid argument, etc.
vperror()
is a
perror(3)-like function that formats and prints a user error
message on stderr
, followed by the system error message
corresponding to the current value of errno
.
vperror()
output is enabled by setting a global variable,
vperror_print
, to a non-zero value.
vperror()
to report errors (in
addition to returning an error code). A rather primitive mechanism
for reporting errors? You betcha - but at least it's there!
vperror_print
is initialized to zero, you normally
won't see any error messages. My programs usually enable
vperror()
output during initialization (when configuration
errors and such like may occur) and disable it thereafter. A command
line option, "-vperror
", is usually available to override
this behavior.
obj_util_debug
variable that can be set to a non-zero value to enable debug output
to stdout
.
More to follow when I think of it ...
In writing my software, I try make it as portable as possible. I make use of ANSI C libraries and header files as much as I can. Function declarations are made in both ANSI C and non-ANSI C form, so the code will compile whether your compiler is ANSI C-compliant or not.
The operating systems I'm using on my current project are: Solaris (SunOS 5.5 on Sun-4 and x86 platforms) and Lynx OS 2.4 (on a PowerPC), a real-time UNIX. For the previous 3 years, I used: SunOS 4.1.3 (on Sun-4 platforms), HP/UX, and VxWorks, a real-time, Unix-like OS running on 68040-based systems. Prior to that, I was on a project for which we ported earlier versions of much of this software from UNIX to VMS (VAX C and UCX TCP/IP).
The software distributions generally include the following Makefiles:
Makefile.hpux
- for building under HP/UX using their ANSI C compiler.
Makefile.lynx
- for building under Lynx 2.4 (Power PC) using gcc.
Makefile.sun4
- for building under SunOS 4.1.3 using cc.
Makefile.sun4os5
- for building under Solaris (Sun-4 platform) using gcc.
Makefile.x86os5
- for building under Solaris (PC platform) using gcc.
Makefile.vx68k
- for building under VxWorks using cc68k.
(At one time, I tried setting up the networking library to use configure, but I got lost in the documentation and the process. configure is a great idea that's too darned complicated - I'm sure we should all be grateful for UNIX and open systems!)
I suspect that most of the non-OS-specific software would build without error on a PC. If someone will loan (or give) me a PC with Windows, I will be happy to test out my theory.
Thanks to the following people for bug and porting reports:
rex_wild()
; if I was
Donald Knuth, I'd pay him for it!
(File Name Juggler)
rex_replace()
.
I don't have the changes required for the various ports, but at least I know it's possible to port the code to the various platforms with relatively little trouble. My apologies to anyone I've left out, including those who reported bugs (e.g., in the quadword utilities and in the IPC utilities) before I started keeping a list here.
, 482k
)Command Line Processing
opt_util
- full-word option scanning package for UNIX-style command lines or strings.Data Structures
cobl_util
- collectable object lists.gsc_util
- generic depth-first and breadth-first graph search package.hash_util
- hash table creation/search package.list_util
- generic list handling package.tpl_util
- N-tuple creation and element retrieval.Error Reporting
vperror
-perror(3)
-like error reporting function.Files
drs_util
- directory scanning package.eio_util
- extensible I/O package for user-level, application-specific device drivers.fnm_util
- file name parsing package.Interprocess Communication
The IPC packages provide named message queues, semaphores, and shared memory segments under UNIX and VxWorks. Earlier versions of the semaphore and shared memory packages were ported to VMS by Fred Shaklan and myself; message queues were not needed, but they could have been easily emulated using mailboxes. If I ever work on VMS again, I'll port the new packages; the package APIs are operating system-independent.
msq_util
- high-level interface to named message queues (UNIX and VxWorks).nob_util
- named objects database package.sem_util
- high-level interface to named semaphores (UNIX and VxWorks).shm_util
- high-level interface to named shared memory (UNIX and VxWorks).Memory Management
meo_util
- memory operations.String Manipulation
get_util
- miscellaneous string scanning functions.rex_util
- full-featured regular expression matching and substitution package.str_util
- miscellaneous string handling functions.Time
bmw_util
- benchmarking package.ts_util
- POSIX timespec manipulation package.tv_util
- UNIX timeval manipulation package.Miscellaneous
bit_util
- bit manipulation functions.ckp_util
- checkpointing package.dympl_util
- dynamically loads object modules (UNIX, VMS, VxWorks).xbm_util
- X bitmap (XBM) utilities.xqt_util
- shell execution package (high-level interface to UNIX shell or VMS CLI).Networking (libnet.tar.Z
, 328k
)(This library distribution is a subset of the libgpl library, plus some test clients and servers.)
The following packages provide high-level, but powerful, interfaces to TCP/IP and UDP/IP networking:
tcp_util
- high-level interface for TCP/IP network socket I/O.udp_util
- high-level interface for UDP/IP network socket I/O.And the following packages implement higher-level protocols layered on top of the TCP_UTIL package:
lfn_util
- high-level interface for LF-terminated network I/O.nft_util
- FTP server framework (UNIX, VMS, and VxWorks).xnet_util
- high-level interface toxdr(3)
-based network I/O.The NIX package simplifies the writing of I/O-event-driven applications (e.g., network servers):
nix_util
- non-X-based, X Toolkit-style I/O and timer event dispatcher.port_util
- simple listening ports for NIX dispatcher-based network servers.The remaining packages are an assortment of networking support functions:
net_util
- miscellaneous network functions.qio_util
- application-level, queued I/O facility (UNIX, VMS, and VxWorks).skt_util
- socket support functions.Version-Independent Messages
These three packages implement version-independent messages as described in Appendix B of Robert Martin's Designing Object-Oriented C++ Applications Using the Booch Method. (What he calls attributed data trees, I call name/value lists.) VIM network streams are layered on top of the TCP_UTIL package.
nvp_util
- name/value pairs.nvl_util
- lists of name/value pairs.vim_util
- version-independent message streams.
Endpoint
- generic network endpoint.TcpEndpoint
- TCP/IP endpoint.BufferedTCP
- buffered TCP/IP stream.
Dispatcher
- I/O event dispatcher.HashTable
- hash table creation and search.OptionsScan
- full-word option scanning package for UNIX-style command lines or strings.
VMS - a class operating system. It deserves a better fate; perhaps its reincarnation as Windows NT will rescue it from oblivion. This software was written for a VMS-based satellite control center during 1992-1993; we used the VAX C compiler and DEC's UCX TCP/IP networking product. Porting the original UNIX software to VMS was relatively painless and most of the applications I wrote for the project ported effortlessly back to UNIX afterwards.
lnm_util
- high-level interface to VMS logical name facility.luq_util
- high-level interface for DECmessageQ I/O.mbx_util
- high-level interface to VMS mailboxes.popen
- VMS version of UNIX function.rock_util
- high-level interface to VMS resource locking.sup_util
- distributed "server is up" tracking using VMS locks.tty_util
- high-level interface for VMS terminal I/O.
atexit
- VxWorks implementation of ANSI C function.ef_util
- VxWorks implementation of VMS-like event flags.
eio_mbx
- Extensible I/O driver for MEDS mailbox I/O.eio_packet
- Extensible I/O driver for packet file I/O.kai_util
- KDOS asynchronous file I/O.mist_util
- high-level interface to MEDS message streams.stan_util
- too-high-level interface to MEDS message streams.
edb_util
- EPOCH events database utilities.epc_util
- EPOCH network communications.gv_util
- EPOCH global variables.ins_util
- IN-SNEC CORTEX utilities.nvf_util
- named variable set files.nvr_util
- named variable utilities.nvs_util
- named variable sets.
Endpoint
- network endpoint.TcpEndpoint
- TCP/IP endpoint.BufferedTCP
- buffered TCP/IP stream.
EpochStream
- EPOCH network stream.EpochMessage
- EPOCH network message.
NVar
- named variables.NVarSet
- sets of named variables.NVarFile
- files of named variable sets.
GSegment
- EPOCH global variable segments.GVar
- EPOCH global variables.
Dispatcher
- I/O events dispatcher.HashTable
- hash table creation and search.OptionsScan
- command-line options scanning.
Generic
- dump - formatted dump program.
- ffc - format file in columns.
- fifo - Named pipe talk utility.
- quack - DECmessageQ talk utility.
- rpm - RPC stream merger.
- talknet - network talk utility.
Project-Specific
- events_reader - TPOCC event message reader.
- maple - TPOCC multiple applications emulator.
- molox - module lines-of-code/PDL counter.
- offset - TPOCC system variable information server.
- sdp - TPOCC system variable display tool.
- syncsrc - TPOCC synchronous data source simulator.
- xstol - X11/Motif-based GUI for TPOCC's command language interpreter.
- aemh - X-SAR alarm/event message handler simulator.
- prosper - TPOCC process spawner.
- kdosd - KDOS file server.
- mbc - MEDS message broadcaster/concentrator.
- tsi - TPCE SNMP interface.
- cereal - EPOCH serial interface emulator.
- cornet - CORTEX network tool.
- eire - EPOCH events reader.
- epcot - EPOCH-CORTEX telemetry server.
- glop - EPOCH global variable print.
- gentle
- A network server that provides each client with its own Tcl interpreter, extended with networking and hardware debugging commands. (Derived from earlier programs, nicl and picl!)
- hope
- A Tcl-based, programmable HTTP server. hope was originally a separate program; since I needed some of gentle's capabilities, however, I ended up just adding some HTTP commands to gentle. (Also see HOPE/LZP, HOPE/ETS, and HOPE/Epoch.)
- moi
- A Tcl-based, programmable X11 (Tk) graphical user interface. (Derived from earlier Motif programs, wimp and twerp!) For an overview of gentle and moi, see my slightly out-of-date memo, "C'est Moi!". I subsequently developed a Motif equivalent to moi, called plum, which resulted in a reworking of the display classes so that the same status page definitions could be used by both the Tk and Motif versions of the GUI.
- nacc
- Not another compiler-compiler?! In FORTRAN, no less!
- nafta
- Not another file transfer application?! (Superseded by pose.)
- npath
- Collects function-by-function metrics for C source code. The metrics include lines-of-code, Halstead's Software Science volume, McCabe's cyclomatic complexity, and NPATH.
- oflow
- Generates cflow(1)-style structure charts from VMS object modules.
- plum
- A Tcl-based, programmable X11 (Motif) graphical user interface. (The Motif equivalent of moi.)
- pose
- A pocket FTP/WWW server, included in the libnet distribution.