1 /* Copyright (C) 1997, 1998, 1999 Aladdin Enterprises. All rights reserved. 2 3 This software is provided AS-IS with no warranty, either express or 4 implied. 5 6 This software is distributed under license and may not be copied, 7 modified or distributed except as expressly authorized under the terms 8 of the license contained in the file LICENSE in this distribution. 9 10 For more information about licensing, please refer to 11 http://www.ghostscript.com/licensing/. For information on 12 commercial licensing, go to http://www.artifex.com/licensing/ or 13 contact Artifex Software, Inc., 101 Lucas Valley Road #110, 14 San Rafael, CA 94903, U.S.A., +1(415)492-9861. 15 */ 16 17 /* $Id: gsargs.h,v 1.7 2002/06/16 08:45:42 lpd Exp $ */ 18 /* Command line argument list management */ 19 20 #ifndef gsargs_INCLUDED 21 # define gsargs_INCLUDED 22 23 /* 24 * We need to handle recursion into @-files. 25 * The following structures keep track of the state. 26 * Defining a maximum argument length and a maximum nesting depth 27 * decreases generality, but eliminates the need for dynamic allocation. 28 */ 29 #define arg_str_max 2048 30 #define arg_depth_max 10 31 typedef struct arg_source_s { 32 bool is_file; 33 union _u { 34 struct _su { 35 char *chars; /* original string */ 36 gs_memory_t *memory; /* if non-0, free chars when done with it */ 37 const char *str; /* string being read */ 38 } s; 39 FILE *file; 40 } u; 41 } arg_source; 42 typedef struct arg_list_s { 43 bool expand_ats; /* if true, expand @-files */ 44 FILE *(*arg_fopen) (const char *fname, void *fopen_data); 45 void *fopen_data; 46 const char **argp; 47 int argn; 48 int depth; /* depth of @-files */ 49 char cstr[arg_str_max + 1]; 50 arg_source sources[arg_depth_max]; 51 } arg_list; 52 53 /* Initialize an arg list. */ 54 void arg_init(arg_list * pal, const char **argv, int argc, 55 FILE * (*arg_fopen) (const char *fname, void *fopen_data), 56 void *fopen_data); 57 58 /* 59 * Push a string onto an arg list. 60 * This may also be used (once) to "unread" the last argument. 61 * If mem != 0, it is used to free the string when we are done with it. 62 * Return 0 on success, non-zero on failure 63 */ 64 int arg_push_memory_string(arg_list * pal, char *str, gs_memory_t * mem); 65 66 #define arg_push_string(pal, str)\ 67 arg_push_memory_string(pal, str, (gs_memory_t *)0); 68 69 /* Clean up an arg list before exiting. */ 70 void arg_finit(arg_list * pal); 71 72 /* 73 * Get the next arg from a list. 74 * Note that these are not copied to the heap. 75 */ 76 const char *arg_next(arg_list * pal, int *code); 77 78 /* Copy an argument string to the heap. */ 79 char *arg_copy(const char *str, gs_memory_t * mem); 80 81 #endif /* gsargs_INCLUDED */ 82