1ea906c41SOllivier Robert /* -*- buffer-read-only: t -*- vi: set ro: 2ea906c41SOllivier Robert * 3ea906c41SOllivier Robert * DO NOT EDIT THIS FILE (genshell.c) 4ea906c41SOllivier Robert * 5ea906c41SOllivier Robert * It has been AutoGen-ed Saturday May 5, 2007 at 12:02:35 PM PDT 6ea906c41SOllivier Robert * From the definitions genshell.def 7ea906c41SOllivier Robert * and the template file options 8ea906c41SOllivier Robert * 9ea906c41SOllivier Robert * Generated from AutoOpts 29:0:4 templates. 10ea906c41SOllivier Robert */ 11ea906c41SOllivier Robert 12ea906c41SOllivier Robert /* 13ea906c41SOllivier Robert * This file was produced by an AutoOpts template. AutoOpts is a 14ea906c41SOllivier Robert * copyrighted work. This source file is not encumbered by AutoOpts 15ea906c41SOllivier Robert * licensing, but is provided under the licensing terms chosen by the 16ea906c41SOllivier Robert * genshellopt author or copyright holder. AutoOpts is licensed under 17ea906c41SOllivier Robert * the terms of the LGPL. The redistributable library (``libopts'') is 18ea906c41SOllivier Robert * licensed under the terms of either the LGPL or, at the users discretion, 19ea906c41SOllivier Robert * the BSD license. See the AutoOpts and/or libopts sources for details. 20ea906c41SOllivier Robert * 21ea906c41SOllivier Robert * This source file is copyrighted and licensed under the following terms: 22ea906c41SOllivier Robert * 23ea906c41SOllivier Robert * genshellopt copyright 1999-2007 Bruce Korb - all rights reserved 24ea906c41SOllivier Robert * 25ea906c41SOllivier Robert * genshellopt is free software; you can redistribute it and/or 26ea906c41SOllivier Robert * modify it under the terms of the GNU Lesser General Public 27ea906c41SOllivier Robert * License as published by the Free Software Foundation; either 28ea906c41SOllivier Robert * version 2.1 of the License, or (at your option) any later version. 29ea906c41SOllivier Robert * 30ea906c41SOllivier Robert * genshellopt is distributed in the hope that it will be useful, 31ea906c41SOllivier Robert * but WITHOUT ANY WARRANTY; without even the implied warranty of 32ea906c41SOllivier Robert * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 33ea906c41SOllivier Robert * Lesser General Public License for more details. 34ea906c41SOllivier Robert * 35ea906c41SOllivier Robert * You should have received a copy of the GNU Lesser General Public 36ea906c41SOllivier Robert * License along with genshellopt. If not, write to: 37ea906c41SOllivier Robert * The Free Software Foundation, Inc., 38ea906c41SOllivier Robert * 51 Franklin Street, Fifth Floor 39ea906c41SOllivier Robert * Boston, MA 02110-1301, USA. 40ea906c41SOllivier Robert */ 41ea906c41SOllivier Robert 42ea906c41SOllivier Robert 43ea906c41SOllivier Robert #include <limits.h> 44ea906c41SOllivier Robert 45ea906c41SOllivier Robert #define OPTION_CODE_COMPILE 1 46ea906c41SOllivier Robert #include "genshell.h" 47ea906c41SOllivier Robert 48ea906c41SOllivier Robert #ifdef __cplusplus 49ea906c41SOllivier Robert extern "C" { 50ea906c41SOllivier Robert #endif 51ea906c41SOllivier Robert tSCC zCopyright[] = 52ea906c41SOllivier Robert "genshellopt copyright (c) 1999-2007 Bruce Korb, all rights reserved"; 53ea906c41SOllivier Robert tSCC zCopyrightNotice[] = 54ea906c41SOllivier Robert "genshellopt is free software; you can redistribute it and/or\n\ 55ea906c41SOllivier Robert modify it under the terms of the GNU Lesser General Public\n\ 56ea906c41SOllivier Robert License as published by the Free Software Foundation; either\n\ 57ea906c41SOllivier Robert version 2.1 of the License, or (at your option) any later version.\n\n\ 58ea906c41SOllivier Robert genshellopt is distributed in the hope that it will be useful,\n\ 59ea906c41SOllivier Robert but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ 60ea906c41SOllivier Robert MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n\ 61ea906c41SOllivier Robert Lesser General Public License for more details.\n\n\ 62ea906c41SOllivier Robert You should have received a copy of the GNU Lesser General Public\n\ 63ea906c41SOllivier Robert License along with genshellopt. If not, write to:\n\ 64ea906c41SOllivier Robert \tThe Free Software Foundation, Inc.,\n\ 65ea906c41SOllivier Robert \t51 Franklin Street, Fifth Floor\n\ 66ea906c41SOllivier Robert \tBoston, MA 02110-1301, USA."; 67ea906c41SOllivier Robert extern tUsageProc genshelloptUsage; 68ea906c41SOllivier Robert 69ea906c41SOllivier Robert #ifndef NULL 70ea906c41SOllivier Robert # define NULL 0 71ea906c41SOllivier Robert #endif 72ea906c41SOllivier Robert #ifndef EXIT_SUCCESS 73ea906c41SOllivier Robert # define EXIT_SUCCESS 0 74ea906c41SOllivier Robert #endif 75ea906c41SOllivier Robert #ifndef EXIT_FAILURE 76ea906c41SOllivier Robert # define EXIT_FAILURE 1 77ea906c41SOllivier Robert #endif 78ea906c41SOllivier Robert /* 79ea906c41SOllivier Robert * Script option description: 80ea906c41SOllivier Robert */ 81ea906c41SOllivier Robert tSCC zScriptText[] = 82ea906c41SOllivier Robert "Output Script File"; 83ea906c41SOllivier Robert tSCC zScript_NAME[] = "SCRIPT"; 84ea906c41SOllivier Robert tSCC zScript_Name[] = "script"; 85ea906c41SOllivier Robert #define SCRIPT_FLAGS (OPTST_DISABLED \ 86ea906c41SOllivier Robert | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING)) 87ea906c41SOllivier Robert 88ea906c41SOllivier Robert /* 89ea906c41SOllivier Robert * Shell option description: 90ea906c41SOllivier Robert */ 91ea906c41SOllivier Robert tSCC zShellText[] = 92ea906c41SOllivier Robert "Shell name (follows \"#!\" magic)"; 93ea906c41SOllivier Robert tSCC zShell_NAME[] = "SHELL"; 94ea906c41SOllivier Robert tSCC zNotShell_Name[] = "no-shell"; 95ea906c41SOllivier Robert tSCC zNotShell_Pfx[] = "no"; 96ea906c41SOllivier Robert #define zShell_Name (zNotShell_Name + 3) 97ea906c41SOllivier Robert #define SHELL_FLAGS (OPTST_INITENABLED \ 98ea906c41SOllivier Robert | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING)) 99ea906c41SOllivier Robert 100ea906c41SOllivier Robert /* 101ea906c41SOllivier Robert * Help/More_Help/Version option descriptions: 102ea906c41SOllivier Robert */ 103ea906c41SOllivier Robert tSCC zHelpText[] = "Display usage information and exit"; 104ea906c41SOllivier Robert tSCC zHelp_Name[] = "help"; 105ea906c41SOllivier Robert 106ea906c41SOllivier Robert tSCC zMore_HelpText[] = "Extended usage information passed thru pager"; 107ea906c41SOllivier Robert tSCC zMore_Help_Name[] = "more-help"; 108ea906c41SOllivier Robert 109ea906c41SOllivier Robert tSCC zVersionText[] = "Output version information and exit"; 110ea906c41SOllivier Robert tSCC zVersion_Name[] = "version"; 111ea906c41SOllivier Robert /* 112ea906c41SOllivier Robert * Declare option callback procedures 113ea906c41SOllivier Robert */ 114ea906c41SOllivier Robert extern tOptProc 115ea906c41SOllivier Robert optionPagedUsage, optionPrintVersion; 116ea906c41SOllivier Robert static tOptProc 117ea906c41SOllivier Robert doUsageOpt; 118ea906c41SOllivier Robert 119ea906c41SOllivier Robert /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 120ea906c41SOllivier Robert * 121ea906c41SOllivier Robert * Define the Genshellopt Option Descriptions. 122ea906c41SOllivier Robert */ 123ea906c41SOllivier Robert static tOptDesc optDesc[ OPTION_CT ] = { 124ea906c41SOllivier Robert { /* entry idx, value */ 0, VALUE_OPT_SCRIPT, 125ea906c41SOllivier Robert /* equiv idx, value */ 0, VALUE_OPT_SCRIPT, 126ea906c41SOllivier Robert /* equivalenced to */ NO_EQUIVALENT, 127ea906c41SOllivier Robert /* min, max, act ct */ 0, 1, 0, 128ea906c41SOllivier Robert /* opt state flags */ SCRIPT_FLAGS, 0, 129ea906c41SOllivier Robert /* last opt argumnt */ { NULL }, 130ea906c41SOllivier Robert /* arg list/cookie */ NULL, 131ea906c41SOllivier Robert /* must/cannot opts */ NULL, NULL, 132ea906c41SOllivier Robert /* option proc */ NULL, 133ea906c41SOllivier Robert /* desc, NAME, name */ zScriptText, zScript_NAME, zScript_Name, 134ea906c41SOllivier Robert /* disablement strs */ NULL, NULL }, 135ea906c41SOllivier Robert 136ea906c41SOllivier Robert { /* entry idx, value */ 1, VALUE_OPT_SHELL, 137ea906c41SOllivier Robert /* equiv idx, value */ 1, VALUE_OPT_SHELL, 138ea906c41SOllivier Robert /* equivalenced to */ NO_EQUIVALENT, 139ea906c41SOllivier Robert /* min, max, act ct */ 0, 1, 0, 140ea906c41SOllivier Robert /* opt state flags */ SHELL_FLAGS, 0, 141ea906c41SOllivier Robert /* last opt argumnt */ { NULL }, 142ea906c41SOllivier Robert /* arg list/cookie */ NULL, 143ea906c41SOllivier Robert /* must/cannot opts */ NULL, NULL, 144ea906c41SOllivier Robert /* option proc */ NULL, 145ea906c41SOllivier Robert /* desc, NAME, name */ zShellText, zShell_NAME, zShell_Name, 146ea906c41SOllivier Robert /* disablement strs */ zNotShell_Name, zNotShell_Pfx }, 147ea906c41SOllivier Robert 148ea906c41SOllivier Robert #ifdef NO_OPTIONAL_OPT_ARGS 149ea906c41SOllivier Robert # define VERSION_OPT_FLAGS OPTST_IMM | OPTST_NO_INIT 150ea906c41SOllivier Robert #else 151ea906c41SOllivier Robert # define VERSION_OPT_FLAGS OPTST_SET_ARGTYPE(OPARG_TYPE_STRING) | \ 152ea906c41SOllivier Robert OPTST_ARG_OPTIONAL | OPTST_IMM | OPTST_NO_INIT 153ea906c41SOllivier Robert #endif 154ea906c41SOllivier Robert 155ea906c41SOllivier Robert { /* entry idx, value */ INDEX_OPT_VERSION, VALUE_OPT_VERSION, 156ea906c41SOllivier Robert /* equiv idx value */ NO_EQUIVALENT, 0, 157ea906c41SOllivier Robert /* equivalenced to */ NO_EQUIVALENT, 158ea906c41SOllivier Robert /* min, max, act ct */ 0, 1, 0, 159ea906c41SOllivier Robert /* opt state flags */ VERSION_OPT_FLAGS, 0, 160ea906c41SOllivier Robert /* last opt argumnt */ { NULL }, 161ea906c41SOllivier Robert /* arg list/cookie */ NULL, 162ea906c41SOllivier Robert /* must/cannot opts */ NULL, NULL, 163ea906c41SOllivier Robert /* option proc */ optionPrintVersion, 164ea906c41SOllivier Robert /* desc, NAME, name */ zVersionText, NULL, zVersion_Name, 165ea906c41SOllivier Robert /* disablement strs */ NULL, NULL }, 166ea906c41SOllivier Robert 167ea906c41SOllivier Robert #undef VERSION_OPT_FLAGS 168ea906c41SOllivier Robert 169ea906c41SOllivier Robert 170ea906c41SOllivier Robert { /* entry idx, value */ INDEX_OPT_HELP, VALUE_OPT_HELP, 171ea906c41SOllivier Robert /* equiv idx value */ NO_EQUIVALENT, 0, 172ea906c41SOllivier Robert /* equivalenced to */ NO_EQUIVALENT, 173ea906c41SOllivier Robert /* min, max, act ct */ 0, 1, 0, 174ea906c41SOllivier Robert /* opt state flags */ OPTST_IMM | OPTST_NO_INIT, 0, 175ea906c41SOllivier Robert /* last opt argumnt */ { NULL }, 176ea906c41SOllivier Robert /* arg list/cookie */ NULL, 177ea906c41SOllivier Robert /* must/cannot opts */ NULL, NULL, 178ea906c41SOllivier Robert /* option proc */ doUsageOpt, 179ea906c41SOllivier Robert /* desc, NAME, name */ zHelpText, NULL, zHelp_Name, 180ea906c41SOllivier Robert /* disablement strs */ NULL, NULL }, 181ea906c41SOllivier Robert 182ea906c41SOllivier Robert { /* entry idx, value */ INDEX_OPT_MORE_HELP, VALUE_OPT_MORE_HELP, 183ea906c41SOllivier Robert /* equiv idx value */ NO_EQUIVALENT, 0, 184ea906c41SOllivier Robert /* equivalenced to */ NO_EQUIVALENT, 185ea906c41SOllivier Robert /* min, max, act ct */ 0, 1, 0, 186ea906c41SOllivier Robert /* opt state flags */ OPTST_IMM | OPTST_NO_INIT, 0, 187ea906c41SOllivier Robert /* last opt argumnt */ { NULL }, 188ea906c41SOllivier Robert /* arg list/cookie */ NULL, 189ea906c41SOllivier Robert /* must/cannot opts */ NULL, NULL, 190ea906c41SOllivier Robert /* option proc */ optionPagedUsage, 191ea906c41SOllivier Robert /* desc, NAME, name */ zMore_HelpText, NULL, zMore_Help_Name, 192ea906c41SOllivier Robert /* disablement strs */ NULL, NULL } 193ea906c41SOllivier Robert }; 194ea906c41SOllivier Robert 195ea906c41SOllivier Robert /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 196ea906c41SOllivier Robert * 197ea906c41SOllivier Robert * Define the Genshellopt Option Environment 198ea906c41SOllivier Robert */ 199ea906c41SOllivier Robert tSCC zPROGNAME[] = "GENSHELLOPT"; 200ea906c41SOllivier Robert tSCC zUsageTitle[] = 201ea906c41SOllivier Robert "genshellopt - Generate Shell Option Processing Script - Ver. 1\n\ 202ea906c41SOllivier Robert USAGE: %s [ -<flag> [<val>] | --<name>[{=| }<val>] ]...\n"; 203ea906c41SOllivier Robert #define zRcName NULL 204ea906c41SOllivier Robert #define apzHomeList NULL 205ea906c41SOllivier Robert 206ea906c41SOllivier Robert tSCC zBugsAddr[] = "autogen-users@lists.sourceforge.net"; 207ea906c41SOllivier Robert tSCC zExplain[] = "\n\ 208ea906c41SOllivier Robert Note that `shell' is only useful if the output file does not already\n\ 209ea906c41SOllivier Robert exist. If it does, then the shell name and optional first argument\n\ 210ea906c41SOllivier Robert will be extracted from the script file.\n"; 211ea906c41SOllivier Robert tSCC zDetail[] = "\n\ 212ea906c41SOllivier Robert If the script file already exists and contains Automated Option Processing\n\ 213ea906c41SOllivier Robert text, the second line of the file through the ending tag will be replaced\n\ 214ea906c41SOllivier Robert by the newly generated text. The first `#!' line will be regenerated.\n"; 215ea906c41SOllivier Robert tSCC zFullVersion[] = GENSHELLOPT_FULL_VERSION; 216ea906c41SOllivier Robert /* extracted from optcode.tpl near line 408 */ 217ea906c41SOllivier Robert 218ea906c41SOllivier Robert #if defined(ENABLE_NLS) 219ea906c41SOllivier Robert # define OPTPROC_BASE OPTPROC_TRANSLATE 220ea906c41SOllivier Robert static tOptionXlateProc translate_option_strings; 221ea906c41SOllivier Robert #else 222ea906c41SOllivier Robert # define OPTPROC_BASE OPTPROC_NONE 223ea906c41SOllivier Robert # define translate_option_strings NULL 224ea906c41SOllivier Robert #endif /* ENABLE_NLS */ 225ea906c41SOllivier Robert 226ea906c41SOllivier Robert tOptions genshelloptOptions = { 227ea906c41SOllivier Robert OPTIONS_STRUCT_VERSION, 228ea906c41SOllivier Robert 0, NULL, /* original argc + argv */ 229ea906c41SOllivier Robert ( OPTPROC_BASE 230ea906c41SOllivier Robert + OPTPROC_ERRSTOP 231ea906c41SOllivier Robert + OPTPROC_SHORTOPT 232ea906c41SOllivier Robert + OPTPROC_LONGOPT 233ea906c41SOllivier Robert + OPTPROC_NO_REQ_OPT 234ea906c41SOllivier Robert + OPTPROC_NEGATIONS 235ea906c41SOllivier Robert + OPTPROC_NO_ARGS ), 236ea906c41SOllivier Robert 0, NULL, /* current option index, current option */ 237ea906c41SOllivier Robert NULL, NULL, zPROGNAME, 238ea906c41SOllivier Robert zRcName, zCopyright, zCopyrightNotice, 239ea906c41SOllivier Robert zFullVersion, apzHomeList, zUsageTitle, 240ea906c41SOllivier Robert zExplain, zDetail, optDesc, 241ea906c41SOllivier Robert zBugsAddr, /* address to send bugs to */ 242ea906c41SOllivier Robert NULL, NULL, /* extensions/saved state */ 243ea906c41SOllivier Robert genshelloptUsage, /* usage procedure */ 244ea906c41SOllivier Robert translate_option_strings, /* translation procedure */ 245ea906c41SOllivier Robert /* 246ea906c41SOllivier Robert * Indexes to special options 247ea906c41SOllivier Robert */ 248ea906c41SOllivier Robert { INDEX_OPT_MORE_HELP, 249ea906c41SOllivier Robert 0 /* no option state saving */, 250ea906c41SOllivier Robert NO_EQUIVALENT /* index of '-#' option */, 251ea906c41SOllivier Robert NO_EQUIVALENT /* index of default opt */ 252ea906c41SOllivier Robert }, 253ea906c41SOllivier Robert 5 /* full option count */, 2 /* user option count */ 254ea906c41SOllivier Robert }; 255ea906c41SOllivier Robert 256ea906c41SOllivier Robert /* 257ea906c41SOllivier Robert * Create the static procedure(s) declared above. 258ea906c41SOllivier Robert */ 259ea906c41SOllivier Robert static void 260ea906c41SOllivier Robert doUsageOpt( 261ea906c41SOllivier Robert tOptions* pOptions, 262ea906c41SOllivier Robert tOptDesc* pOptDesc ) 263ea906c41SOllivier Robert { 264ea906c41SOllivier Robert USAGE( EXIT_SUCCESS ); 265ea906c41SOllivier Robert } 266ea906c41SOllivier Robert /* extracted from optcode.tpl near line 514 */ 267ea906c41SOllivier Robert 268ea906c41SOllivier Robert #if ENABLE_NLS 269ea906c41SOllivier Robert #include <stdio.h> 270ea906c41SOllivier Robert #include <stdlib.h> 271ea906c41SOllivier Robert #include <string.h> 272ea906c41SOllivier Robert #include <unistd.h> 273ea906c41SOllivier Robert #include <autoopts/usage-txt.h> 274ea906c41SOllivier Robert 275ea906c41SOllivier Robert static char* AO_gettext( char const* pz ); 276ea906c41SOllivier Robert static void coerce_it(void** s); 277ea906c41SOllivier Robert 278ea906c41SOllivier Robert static char* 279ea906c41SOllivier Robert AO_gettext( char const* pz ) 280ea906c41SOllivier Robert { 281ea906c41SOllivier Robert char* pzRes; 282ea906c41SOllivier Robert if (pz == NULL) 283ea906c41SOllivier Robert return NULL; 284ea906c41SOllivier Robert pzRes = _(pz); 285ea906c41SOllivier Robert if (pzRes == pz) 286ea906c41SOllivier Robert return pzRes; 287ea906c41SOllivier Robert pzRes = strdup( pzRes ); 288ea906c41SOllivier Robert if (pzRes == NULL) { 289ea906c41SOllivier Robert fputs( _("No memory for duping translated strings\n"), stderr ); 290ea906c41SOllivier Robert exit( EXIT_FAILURE ); 291ea906c41SOllivier Robert } 292ea906c41SOllivier Robert return pzRes; 293ea906c41SOllivier Robert } 294ea906c41SOllivier Robert 295ea906c41SOllivier Robert static void coerce_it(void** s) { *s = AO_gettext(*s); } 296ea906c41SOllivier Robert #define COERSION(_f) \ 297ea906c41SOllivier Robert coerce_it((void*)&(genshelloptOptions._f)) 298ea906c41SOllivier Robert 299ea906c41SOllivier Robert /* 300ea906c41SOllivier Robert * This invokes the translation code (e.g. gettext(3)). 301ea906c41SOllivier Robert */ 302ea906c41SOllivier Robert static void 303ea906c41SOllivier Robert translate_option_strings( void ) 304ea906c41SOllivier Robert { 305ea906c41SOllivier Robert /* 306ea906c41SOllivier Robert * Guard against re-translation. It won't work. The strings will have 307ea906c41SOllivier Robert * been changed by the first pass through this code. One shot only. 308ea906c41SOllivier Robert */ 309ea906c41SOllivier Robert if (option_usage_text.field_ct == 0) 310ea906c41SOllivier Robert return; 311ea906c41SOllivier Robert /* 312ea906c41SOllivier Robert * Do the translations. The first pointer follows the field count field. 313ea906c41SOllivier Robert * The field count field is the size of a pointer. 314ea906c41SOllivier Robert */ 315ea906c41SOllivier Robert { 316ea906c41SOllivier Robert char** ppz = (char**)(void*)&(option_usage_text); 317ea906c41SOllivier Robert int ix = option_usage_text.field_ct; 318ea906c41SOllivier Robert 319ea906c41SOllivier Robert do { 320ea906c41SOllivier Robert ppz++; 321ea906c41SOllivier Robert *ppz = AO_gettext(*ppz); 322ea906c41SOllivier Robert } while (--ix > 0); 323ea906c41SOllivier Robert } 324ea906c41SOllivier Robert option_usage_text.field_ct = 0; 325ea906c41SOllivier Robert 326ea906c41SOllivier Robert { 327ea906c41SOllivier Robert tOptDesc* pOD = genshelloptOptions.pOptDesc; 328ea906c41SOllivier Robert int ix = genshelloptOptions.optCt; 329ea906c41SOllivier Robert 330ea906c41SOllivier Robert for (;;) { 331ea906c41SOllivier Robert pOD->pzText = AO_gettext(pOD->pzText); 332ea906c41SOllivier Robert pOD->pz_NAME = AO_gettext(pOD->pz_NAME); 333ea906c41SOllivier Robert pOD->pz_Name = AO_gettext(pOD->pz_Name); 334ea906c41SOllivier Robert pOD->pz_DisableName = AO_gettext(pOD->pz_DisableName); 335ea906c41SOllivier Robert pOD->pz_DisablePfx = AO_gettext(pOD->pz_DisablePfx); 336ea906c41SOllivier Robert if (--ix <= 0) 337ea906c41SOllivier Robert break; 338ea906c41SOllivier Robert pOD++; 339ea906c41SOllivier Robert } 340ea906c41SOllivier Robert } 341ea906c41SOllivier Robert COERSION(pzCopyright); 342ea906c41SOllivier Robert COERSION(pzCopyNotice); 343ea906c41SOllivier Robert COERSION(pzFullVersion); 344ea906c41SOllivier Robert COERSION(pzUsageTitle); 345ea906c41SOllivier Robert COERSION(pzExplain); 346ea906c41SOllivier Robert COERSION(pzDetail); 347ea906c41SOllivier Robert } 348ea906c41SOllivier Robert 349ea906c41SOllivier Robert #endif /* ENABLE_NLS */ 350ea906c41SOllivier Robert 351ea906c41SOllivier Robert #ifdef __cplusplus 352ea906c41SOllivier Robert } 353ea906c41SOllivier Robert #endif 354ea906c41SOllivier Robert /* genshell.c ends here */ 355