1/*********************************************************************** 2* * 3* This software is part of the ast package * 4* Copyright (c) 1985-2011 AT&T Intellectual Property * 5* and is licensed under the * 6* Eclipse Public License, Version 1.0 * 7* by AT&T Intellectual Property * 8* * 9* A copy of the License is available at * 10* http://www.eclipse.org/org/documents/epl-v10.html * 11* (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12* * 13* Information and Software Systems Research * 14* AT&T Research * 15* Florham Park NJ * 16* * 17* Glenn Fowler <gsf@research.att.com> * 18* David Korn <dgk@research.att.com> * 19* Phong Vo <kpv@research.att.com> * 20* * 21***********************************************************************/ 22#pragma prototyped 23/* 24 * Glenn Fowler 25 * AT&T Research 26 * 27 * command line option parse interface 28 */ 29 30#ifndef _OPTION_H 31#define _OPTION_H 32 33#include <ast.h> 34 35#define OPT_VERSION 20070319L 36 37#define OPT_USER (1L<<16) /* first user flag bit */ 38 39struct Opt_s; 40struct Optdisc_s; 41 42typedef int (*Optinfo_f)(struct Opt_s*, Sfio_t*, const char*, struct Optdisc_s*); 43 44typedef struct Optdisc_s 45{ 46 unsigned long version; /* OPT_VERSION */ 47 unsigned long flags; /* OPT_* flags */ 48 char* catalog; /* error catalog id */ 49 Optinfo_f infof; /* runtime info function */ 50} Optdisc_t; 51 52/* NOTE: Opt_t member order fixed by a previous binary release */ 53 54#ifndef _OPT_PRIVATE_ 55#define _OPT_PRIVATE_ \ 56 char pad[3*sizeof(void*)]; 57#endif 58 59typedef struct Opt_s 60{ 61 int again; /* see optjoin() */ 62 char* arg; /* {:,#} string argument */ 63 char** argv; /* most recent argv */ 64 int index; /* argv index */ 65 char* msg; /* error/usage message buffer */ 66 long num; /* OBSOLETE -- use number */ 67 int offset; /* char offset in argv[index] */ 68 char option[8]; /* current flag {-,+} + option */ 69 char name[64]; /* current long name or flag */ 70 Optdisc_t* disc; /* user discipline */ 71 intmax_t number; /* # numeric argument */ 72 unsigned char assignment; /* option arg assigment op */ 73 unsigned char pads[sizeof(void*)-1]; 74 _OPT_PRIVATE_ 75} Opt_t; 76 77#if _BLD_ast && defined(__EXPORT__) 78#define extern extern __EXPORT__ 79#endif 80#if !_BLD_ast && defined(__IMPORT__) 81#define extern extern __IMPORT__ 82#endif 83 84extern Opt_t* _opt_infop_; 85 86#define opt_info (*_opt_infop_) 87 88#undef extern 89 90#define optinit(d,f) (memset(d,0,sizeof(*(d))),(d)->version=OPT_VERSION,(d)->infof=(f),opt_info.disc=(d)) 91 92#if _BLD_ast && defined(__EXPORT__) 93#define extern __EXPORT__ 94#endif 95 96extern int optget(char**, const char*); 97extern int optjoin(char**, ...); 98extern char* opthelp(const char*, const char*); 99extern char* optusage(const char*); 100extern int optstr(const char*, const char*); 101extern int optesc(Sfio_t*, const char*, int); 102extern Opt_t* optctx(Opt_t*, Opt_t*); 103 104#undef extern 105 106#endif 107