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