xref: /openbsd/usr.bin/lex/scanopt.h (revision 72d0ee88)
1*72d0ee88Stedu /* $OpenBSD: scanopt.h,v 1.3 2017/05/31 07:20:26 tedu Exp $ */
2a58c1ecbStedu 
3a58c1ecbStedu /* flex - tool to generate fast lexical analyzers */
4a58c1ecbStedu 
5a58c1ecbStedu /*  Copyright (c) 1990 The Regents of the University of California. */
6a58c1ecbStedu /*  All rights reserved. */
7a58c1ecbStedu 
8a58c1ecbStedu /*  This code is derived from software contributed to Berkeley by */
9a58c1ecbStedu /*  Vern Paxson. */
10a58c1ecbStedu 
11a58c1ecbStedu /*  The United States Government has rights in this work pursuant */
12a58c1ecbStedu /*  to contract no. DE-AC03-76SF00098 between the United States */
13a58c1ecbStedu /*  Department of Energy and the University of California. */
14a58c1ecbStedu 
15a58c1ecbStedu /*  This file is part of flex. */
16a58c1ecbStedu 
17a58c1ecbStedu /*  Redistribution and use in source and binary forms, with or without */
18a58c1ecbStedu /*  modification, are permitted provided that the following conditions */
19a58c1ecbStedu /*  are met: */
20a58c1ecbStedu 
21a58c1ecbStedu /*  1. Redistributions of source code must retain the above copyright */
22a58c1ecbStedu /*     notice, this list of conditions and the following disclaimer. */
23a58c1ecbStedu /*  2. Redistributions in binary form must reproduce the above copyright */
24a58c1ecbStedu /*     notice, this list of conditions and the following disclaimer in the */
25a58c1ecbStedu /*     documentation and/or other materials provided with the distribution. */
26a58c1ecbStedu 
27a58c1ecbStedu /*  Neither the name of the University nor the names of its contributors */
28a58c1ecbStedu /*  may be used to endorse or promote products derived from this software */
29a58c1ecbStedu /*  without specific prior written permission. */
30a58c1ecbStedu 
31a58c1ecbStedu /*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
32a58c1ecbStedu /*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
33a58c1ecbStedu /*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
34a58c1ecbStedu /*  PURPOSE. */
35a58c1ecbStedu 
36a58c1ecbStedu #ifndef SCANOPT_H
37a58c1ecbStedu #define SCANOPT_H
38a58c1ecbStedu 
39a58c1ecbStedu #include "flexdef.h"
40a58c1ecbStedu 
41a58c1ecbStedu 
42a58c1ecbStedu #ifndef NO_SCANOPT_USAGE
43a58c1ecbStedu /* Used by scanopt_usage for pretty-printing. */
44a58c1ecbStedu #ifdef HAVE_NCURSES_H
45a58c1ecbStedu #include <ncurses.h>
46a58c1ecbStedu #endif
47a58c1ecbStedu #endif
48a58c1ecbStedu 
49a58c1ecbStedu #ifdef __cplusplus
50a58c1ecbStedu extern  "C" {
51a58c1ecbStedu #endif
52a58c1ecbStedu #ifndef PROTO
53a58c1ecbStedu #define PROTO(args) args
54a58c1ecbStedu #endif
55a58c1ecbStedu /* Error codes. */ enum scanopt_err_t {
56a58c1ecbStedu 		SCANOPT_ERR_OPT_UNRECOGNIZED = -1,	/* Unrecognized option. */
57a58c1ecbStedu 		SCANOPT_ERR_OPT_AMBIGUOUS = -2,	/* It matched more than one option name. */
58a58c1ecbStedu 		SCANOPT_ERR_ARG_NOT_FOUND = -3,	/* The required arg was not found. */
59a58c1ecbStedu 		SCANOPT_ERR_ARG_NOT_ALLOWED = -4	/* Option does not take an argument. */
60a58c1ecbStedu 	};
61a58c1ecbStedu 
62a58c1ecbStedu 
63a58c1ecbStedu /* flags passed to scanopt_init */
64a58c1ecbStedu 	enum scanopt_flag_t {
65a58c1ecbStedu 		SCANOPT_NO_ERR_MSG = 0x01	/* Suppress printing to stderr. */
66a58c1ecbStedu 	};
67a58c1ecbStedu 
68a58c1ecbStedu /* Specification for a single option. */
69a58c1ecbStedu 	struct optspec_t {
70a58c1ecbStedu 		const char *opt_fmt;	/* e.g., "--foo=FILE", "-f FILE", "-n [NUM]" */
71a58c1ecbStedu 		int     r_val;	/* Value to be returned by scanopt_ex(). */
72a58c1ecbStedu 		const char *desc;	/* Brief description of this option, or NULL. */
73a58c1ecbStedu 	};
74a58c1ecbStedu 	typedef struct optspec_t optspec_t;
75a58c1ecbStedu 
76a58c1ecbStedu 
77a58c1ecbStedu /* Used internally by scanopt() to maintain state. */
78a58c1ecbStedu /* Never modify these value directly. */
79a58c1ecbStedu 	typedef void *scanopt_t;
80a58c1ecbStedu 
81a58c1ecbStedu 
82a58c1ecbStedu /* Initializes scanner and checks option list for errors.
83a58c1ecbStedu  * Parameters:
84a58c1ecbStedu  *   options - Array of options.
85a58c1ecbStedu  *   argc    - Same as passed to main().
86a58c1ecbStedu  *   argv    - Same as passed to main(). First element is skipped.
87a58c1ecbStedu  *   flags   - Control behavior.
88a58c1ecbStedu  * Return:  A malloc'd pointer .
89a58c1ecbStedu  */
90a58c1ecbStedu 	scanopt_t *scanopt_init PROTO ((const optspec_t * options,
91a58c1ecbStedu 					int argc, char **argv, int flags));
92a58c1ecbStedu 
93*72d0ee88Stedu /* Frees memory used by scanner. */
94*72d0ee88Stedu 	void scanopt_destroy PROTO ((scanopt_t * scanner));
95a58c1ecbStedu 
96a58c1ecbStedu #ifndef NO_SCANOPT_USAGE
97a58c1ecbStedu /* Prints a usage message based on contents of optlist.
98a58c1ecbStedu  * Parameters:
99a58c1ecbStedu  *   scanner  - The scanner, already initialized with scanopt_init().
100a58c1ecbStedu  *   fp       - The file stream to write to.
101a58c1ecbStedu  *   usage    - Text to be prepended to option list. May be NULL.
102a58c1ecbStedu  * Return:  Always returns 0 (zero).
103a58c1ecbStedu  */
104a58c1ecbStedu 	int scanopt_usage
105a58c1ecbStedu 		PROTO (
106a58c1ecbStedu 		       (scanopt_t * scanner, FILE * fp,
107a58c1ecbStedu 			const char *usage));
108a58c1ecbStedu #endif
109a58c1ecbStedu 
110a58c1ecbStedu /* Scans command-line options in argv[].
111a58c1ecbStedu  * Parameters:
112a58c1ecbStedu  *   scanner  - The scanner, already initialized with scanopt_init().
113a58c1ecbStedu  *   optarg   - Return argument, may be NULL.
114a58c1ecbStedu  *              On success, it points to start of an argument.
115a58c1ecbStedu  *   optindex - Return argument, may be NULL.
116a58c1ecbStedu  *              On success or failure, it is the index of this option.
117a58c1ecbStedu  *              If return is zero, then optindex is the NEXT valid option index.
118a58c1ecbStedu  *
119a58c1ecbStedu  * Return:  > 0 on success. Return value is from optspec_t->rval.
120a58c1ecbStedu  *         == 0 if at end of options.
121a58c1ecbStedu  *          < 0 on error (return value is an error code).
122a58c1ecbStedu  *
123a58c1ecbStedu  */
124a58c1ecbStedu 	int scanopt
125a58c1ecbStedu 		PROTO (
126a58c1ecbStedu 		       (scanopt_t * scanner, char **optarg,
127a58c1ecbStedu 			int *optindex));
128a58c1ecbStedu 
129a58c1ecbStedu #ifdef __cplusplus
130a58c1ecbStedu }
131a58c1ecbStedu #endif
132a58c1ecbStedu #endif
133