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