1
0
mirror of https://github.com/PDP-10/klh10.git synced 2026-02-06 08:25:37 +00:00
Files
PDP-10.klh10/src/prmstr.h
2015-04-27 22:54:12 +02:00

203 lines
5.6 KiB
C
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* PRMSTR.H - Parameter & String Parsing support definitions
*/
/* $Id: prmstr.h,v 2.4 2001/11/10 21:28:59 klh Exp $
*/
/* Copyright © 1994, 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
**
** This software is provided "AS IS" with NO WARRANTY OF ANY KIND.
**
** This notice (including the copyright and warranty disclaimer)
** must be included in all copies or derivations of this software.
*/
/*
* $Log: prmstr.h,v $
* Revision 2.4 2001/11/10 21:28:59 klh
* Final 2.0 distribution checkin
*
*/
#ifndef PRMSTR_INCLUDED
#define PRMSTR_INCLUDED 1
#ifdef RCSID
RCSID(prmstr_h,"$Id: prmstr.h,v 2.4 2001/11/10 21:28:59 klh Exp $")
#endif
#include "word10.h"
/* Canonical C true/false values */
#ifndef TRUE
# define TRUE 1
#endif
#ifndef FALSE
# define FALSE 0
#endif
/* Commonly needed type (at one time "void" was unknown) */
typedef void *voidp_t;
#define PRMQUOTCHAR '\\'
/* Interaction-oriented variable=value parsing stuff */
/* Primarily for use by main command parser */
union prmval {
int vi;
long vl;
char *vs;
w10_t vw;
};
struct prmvar_s; /* Forward tag */
struct prmvcx_s { /* Parameter variable context */
struct prmvar_s *prmvcx_var; /* Pointer to var being processed */
union prmval prmvcx_val; /* Current value */
char *prmvcx_str; /* Actual parameter string */
FILE *prmvcx_of; /* Normal output if any */
FILE *prmvcx_ef; /* Error output if any */
};
#define PRMVAR(name, help, typf, loc, set, sho) \
{ name, help, typf, (voidp_t)(loc), set, sho }
struct prmvar_s {
char *prmv_name; /* Variable name */
char *prmv_help; /* Minimal help text */
int prmv_typf; /* Type and flags */
voidp_t prmv_loc; /* Generic pointer */
int (*prmv_set)(struct prmvcx_s *);
int (*prmv_sho)(struct prmvcx_s *);
};
#define PRMV_TYPES \
prmvdef(PRMVT_NULL=0, "NULL"), \
prmvdef(PRMVT_BOO, "boolean"), \
prmvdef(PRMVT_DEC, "decimal"), \
prmvdef(PRMVT_OCT, "octal"), \
prmvdef(PRMVT_STR, "string"), \
prmvdef(PRMVT_WRD, "10word"), \
prmvdef(PRMVT_6, "<unknown6>"), \
prmvdef(PRMVT_7, "<unknown7>"), \
prmvdef(PRMVT_N, NULL)
enum { /* Define enums for variable types */
# define prmvdef(i,s) i
PRMV_TYPES
# undef prmvdef
};
#define PRMVF_TYPE 07 /* Mask for type number (PRMVT_ value) */
#define PRMVF_DYNS 0100 /* String is dynamically allocated */
/* (This could be problematical if there
** are aliases for a DYN var's name, since
** the flag is updated in only one place)
** (Could invent PRMVT_ALIAS w/ptr?)
*/
extern int prm_varset(char **, struct prmvar_s *, FILE *, FILE *);
extern int prm_varlineset(char *, struct prmvar_s *, FILE *, FILE *);
extern int prm_varshow(struct prmvar_s *, FILE *);
extern int prmvp_set(struct prmvcx_s *);
/* Key lookup stuff */
struct prmkey_s {
char *prmk_key;
char *prmk_p; /* Actually a (void *) */
};
#define S_KEYSBEGIN(name) struct prmkey_s name[] = {
#define S_KEYDEF(key,nod) { key, (char *)(nod) },
#define S_KEYSEND { 0, 0 } };
extern void *s_fkeylookup(char *cp, voidp_t tab, size_t entsiz);
extern int s_keylookup (char *cp, voidp_t tab, size_t entsiz,
voidp_t *k1, voidp_t *k2);
extern int s_xkeylookup(char *cp, voidp_t tab, size_t entsiz,
voidp_t *k1, voidp_t *k2, int *x1, int *x2);
/* Random useful string stuff */
extern int s_tokenize(char **, int, char **, size_t *, char **, size_t *);
extern char *s_1token(char **, size_t *, char **, size_t *);
extern size_t s_eztoken(char *, size_t , char **);
extern int s_tobool(char *, int *);
extern int s_tonum(char *, long *);
extern int s_todnum(char *, long *);
extern int s_towd(char *, w10_t *);
extern char *s_dup(char *);
extern int s_match(char *, char *);
/* New parameter parsing stuff */
/* Iterative scheme to process string of the form
<var> <var>=<val> ...
foo()
{
struct prmstate_s prm;
char workbuff[<size>];
...
prm_init(&prm, workbuff, sizeof(workbuff),
inpstr, strlen(inpstr),
keytab, keysiz);
...
for (;;) switch (prm_next(&prm)) {
case PRMK_DONE:
case PRMK_NONE: // prm_name & prm_val set
case PRMK_AMBI: // Ditto, plus prm_matches, prm_idx, prm_idx2
case <other>: // Specific unique match case
default: // Handle matches not supported
}
}
*/
#define PRMK_NONE (-1) /* No match */
#define PRMK_DONE (-2) /* Input string done */
#define PRMK_AMBI (-3) /* Token ambiguous */
struct prmstate_s {
/* Vars that must be initialized */
char *prm_icp; /* Input string */
size_t prm_iln; /* Input length */
char *prm_bcp; /* Buffer pointer */
size_t prm_bln; /* Buffer length */
size_t prm_keysiz; /* Size of each keyword table entry */
struct prmkey_s *
prm_keytab; /* Pointer to keyword table */
/* Vars returned by each call to prm_next() */
char *prm_name; /* Parameter name if one */
char *prm_val; /* Parameter value if one */
int prm_nhits; /* # of matches */
int prm_idx; /* Index of 1st match */
int prm_idx2; /* Index of 2nd match */
struct prmkey_s *
prm_key, /* Pointers to matching entries */
prm_key2;
};
#define prm_init(prm, buff, blen, inpstr, inplen, keytab, keysiz) ( \
(prm)->prm_bcp = (buff), \
(prm)->prm_bln = (blen), \
(prm)->prm_icp = (inpstr), \
(prm)->prm_iln = (inplen), \
(prm)->prm_keytab = (struct prmkey_s *)(keytab), \
(prm)->prm_keysiz = (keysiz) )
extern int prm_next(struct prmstate_s *);
#endif /* ifndef PRMSTR_INCLUDED */