X-Git-Url: http://gitweb.hugovil.com/?a=blobdiff_plain;f=src%2Foptions.c;h=39efd5727400013491cc94113921913e2a6a4c1d;hb=5905b40585298defb8e4230adfe90dfbccb465b9;hp=e32f81155230d7fa1a840829c82773ed9632c40f;hpb=ec415e2315bfcf647e07febba35db4ef709b27d0;p=emu8051.git diff --git a/src/options.c b/src/options.c index e32f811..39efd57 100644 --- a/src/options.c +++ b/src/options.c @@ -1,6 +1,13 @@ -/* options.c -- functions for processing command-line options and arguments - Copyright (C) 2003 Hugo Villeneuve */ - +/* + * options.c -- functions for processing command-line options and arguments + * + * Copyright (C) 2011 Hugo Villeneuve + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ #if HAVE_CONFIG_H # include "config.h" @@ -9,6 +16,7 @@ #include #include #include +#include #if STDC_HEADERS # include @@ -18,102 +26,142 @@ #include "common.h" #include "options.h" +#include "memory.h" +const char *argp_program_version = PACKAGE_VERSION; +const char *argp_program_bug_address = PACKAGE_BUGREPORT; -char *hex_file; +#define PACKAGE_DOC_LENGTH 128 +/* Program documentation. */ +static char str_doc[PACKAGE_DOC_LENGTH]; -char * -GetHexFileName( void ) -{ - return hex_file; -} +/* How many arguments we accept. */ +#define ARGS_COUNT 1 +/* A description of the arguments we accept. */ +static const char args_doc[] = "[FILENAME]"; -/******************************************************************************* - * Display the help message and exit - ******************************************************************************/ -static void -DisplayUsage( void ) +/* The options we understand. */ +static struct argp_option argp_options[] = { + {"debug", 'd', "level", 0, "Produce debugging output" }, + {"iram", 'i', "size", 0, "Set internal ram size" }, + {"pram", 'p', "size", 0, "Set program memory size" }, + {"xram", 'x', "size", 0, "Set external ram size (default is 1024)" }, + { 0 } +}; + +struct options_t options; + +const char * +get_package_description(void) { - printf( "Usage: %s [OPTION]... [FILENAME]\n", PACKAGE ); - printf( "Simulator/emulator for 8051 family microcontrollers.\n\n" ); - printf( " -h display this help and exit\n" ); - printf( " -version display version information and exit\n"); - printf( "\n" ); + return "Emulator for 8051 family microcontrollers"; } - -/******************************************************************************* - * Display version information and exit - ******************************************************************************/ static void -DisplayVersion( void ) +decode_debug_option(char *arg, struct argp_state *state) { - printf( "\n" ); - printf( " %s, version %s\n", PACKAGE, VERSION ); - printf( " Written by Hugo Villeneuve, Jonathan St-André and Pascal Fecteau.\n\n" ); -} + char *endptr; + int log_level; + log_level = strtol(arg, &endptr, 0); + + if (*endptr != '\0') { + log_err("Invalid log level"); + argp_usage(state); + } + + if (log_level > LOG_LEVEL_DEBUG) { + log_err("Invalid log level (0 to 3)"); + argp_usage(state); + } + + options.log = log_level; +} static void -InvalidOption( const char *message, /*@null@*/ const char *string ) +decode_memory_size(char *arg, struct argp_state *state, int memid) { - if( string == NULL ) { - fprintf(stderr, "%s: %s\n", PACKAGE, message ); - } - else { - fprintf(stderr, "%s: %s %s\n", PACKAGE, message, string ); - } + char *endptr; + int *dest; + + if (memid == PGM_MEM_ID) + dest = &options.pram_size; + else if (memid == INT_MEM_ID) + dest = &options.iram_size; + else if (memid == EXT_MEM_ID) + dest = &options.xram_size; + else + exit(1); /* Programming error. */ + + /* + * Sizes versus max memory sizes will be checked when calling + * memory_init(). + */ + *dest = strtol(arg, &endptr, 0); + + if (*endptr != '\0') { + log_err("Invalid memory size"); + argp_usage(state); + } +} - fprintf(stderr, "Try `%s -h' for more information.\n", PACKAGE ); +/* Parse a single option. */ +static error_t +parse_opt(int key, char *arg, struct argp_state *state) +{ + switch (key) { + case 'd': + decode_debug_option(arg, state); + break; + case 'i': + decode_memory_size(arg, state, INT_MEM_ID); + break; + case 'p': + decode_memory_size(arg, state, PGM_MEM_ID); + break; + case 'x': + decode_memory_size(arg, state, EXT_MEM_ID); + break; + case ARGP_KEY_ARG: + if (state->arg_num >= ARGS_COUNT) { + /* Too many arguments. */ + argp_usage(state); + } + + options.filename = arg; + break; + case ARGP_KEY_END: + if (state->arg_num < ARGS_COUNT) { + /* Not enough arguments, but the filename is optional. + So no error. */ + } + break; + default: + return ARGP_ERR_UNKNOWN; + } - exit( EXIT_FAILURE ); + return 0; } +/* Our argp parser. */ +static struct argp argp = { argp_options, parse_opt, args_doc, str_doc }; -/******************************************************************************* - * Initializes the different options passed as arguments on the command line. - ******************************************************************************/ +/* Initializes the different options passed as arguments on the command line. */ void -ParseCommandLineOptions( int argc, char *argv[] ) +parse_command_line_options(int argc, char *argv[]) { - int i; - char *token; - - for( i = 1; i < argc; i++ ) { - token = argv[i]; - switch( token[0] ) { - case '-': - /* Processing options names */ - switch( token[1] ) { - case 'h': - if( strlen( &token[1] ) == 1 ) { - DisplayUsage(); - exit( EXIT_SUCCESS ); - } - InvalidOption( "invalid option", token ); - break; - case 'v' : - if( STREQ( "version", &token[1] ) ) { - DisplayVersion(); - exit( EXIT_SUCCESS ); - } - else { - InvalidOption( "invalid option", token ); - } - break; - default: - InvalidOption( "invalid option", token ); - break; - } /* end switch( token[1] ) */ - break; - default: - /* Processing options arguments */ - /* Must be the filename... */ - hex_file = token; - break; - } /* end switch( token[0] ) */ - } /* end for */ - + snprintf(str_doc, PACKAGE_DOC_LENGTH, "%s -- %s", PACKAGE_NAME, + get_package_description()); + + /* Setting default values. */ + options.filename = NULL; + options.pram_size = PGM_MEM_DEFAULT_SIZE; + options.iram_size = INT_MEM_MAX_SIZE; + options.xram_size = EXT_MEM_DEFAULT_SIZE; + options.log = LOG_LEVEL_ERR; + + /* Parse our arguments. */ + argp_parse(&argp, argc, argv, 0, 0, NULL); }