📄 configfile.c
字号:
/************************************************************************* COPYRIGHT AND WARRANTY INFORMATION** Copyright 2001, International Telecommunications Union, Geneva** DISCLAIMER OF WARRANTY** These software programs are available to the user without any* license fee or royalty on an "as is" basis. The ITU disclaims* any and all warranties, whether express, implied, or* statutory, including any implied warranties of merchantability* or of fitness for a particular purpose. In no event shall the* contributor or the ITU be liable for any incidental, punitive, or* consequential damages of any kind whatsoever arising from the* use of these programs.** This disclaimer of warranty extends to the user of these programs* and user's customers, employees, agents, transferees, successors,* and assigns.** The ITU does not represent or warrant that the programs furnished* hereunder are free of infringement of any third-party patents.* Commercial implementations of ITU-T Recommendations, including* shareware, may be subject to royalty fees to patent holders.* Information regarding the ITU-T patent policy is available from* the ITU Web site at http://www.itu.int.** THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE ITU-T PATENT POLICY.*************************************************************************//*! *********************************************************************** * \file * configfile.c * \brief * Configuration handling. * \author * Main contributors (see contributors.h for copyright, address and affiliation details) * - Stephan Wenger <stewe@cs.tu-berlin.de> * \note * In the future this module should hide the Parameters and offer only * Functions for their access. Modules which make frequent use of some parameters * (e.g. picture size in macroblocks) are free to buffer them on local variables. * This will not only avoid global variable and make the code more readable, but also * speed it up. It will also greatly facilitate future enhancements such as the * handling of different picture sizes in the same sequence. \n * \n * For now, everything is just copied to the inp_par structure (gulp) * ************************************************************************************** * \par New configuration File Format ************************************************************************************** * Format is line oriented, maximum of one parameter per line \n * \n * Lines have the following format: \n * <ParameterName> = <ParameterValue> # Comments \\n \n * Whitespace is space and \\t * \par * <ParameterName> are the predefined names for Parameters and are case sensitive. * See configfile.h for the definition of those names and their mapping to * configinput->values. * \par * <ParameterValue> are either integers [0..9]* or strings. * Integers must fit into the wordlengths, signed values are generally assumed. * Strings containing no whitespace characters can be used directly. Strings containing * whitespace characters are to be inclosed in double quotes ("string with whitespace") * The double quote character is forbidden (may want to implement something smarter here). * \par * Any Parameters whose ParameterName is undefined lead to the termination of the program * with an error message. * * \par Known bug/Shortcoming: * zero-length strings (i.e. to signal an non-existing file * have to be coded as "". * * \par Rules for using command files * \n * All Parameters are initially taken from DEFAULTCONFIGFILENAME, defined in configfile.h. * If an -f <config> parameter is present in the command line then this file is used to * update the defaults of DEFAULTCONFIGFILENAME. There can be more than one -f parameters * present. If -p <ParameterName = ParameterValue> parameters are present then these * overide the default and the additional config file's settings, and are themselfes * overridden by future -p parameters. There must be whitespace between -f and -p commands * and their respecitive parameters *********************************************************************** */#define INCLUDED_BY_CONFIGFILE_C#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include "global.h"#include "configfile.h"static char *GetConfigFileContent (char *Filename);static void ParseContent (char *buf, int bufsize);static int ParameterNameToMapIndex (char *s);static void PatchInp ();#define MAX_ITEMS_TO_PARSE 10000/*! *********************************************************************** * \brief * Parse the command line parameters and read the config files. * \param ac * number of command line parameters * \param av * command line parameters *********************************************************************** */void Configure (int ac, char *av[]){ char *content; int CLcount, ContentLen, NumberParams; memset (&configinput, 0, sizeof (InputParameters));#ifdef H26L_LIB if (ac > 0) { ParseContent (av[0], strlen(av[0])); } else { printf("Warning: no configuration given\n"); }#else // Process default config file printf ("Parsing Configfile %s", DEFAULTCONFIGFILENAME); content = GetConfigFileContent (DEFAULTCONFIGFILENAME); ParseContent (content, strlen(content)); printf ("\n"); free (content); // Parse the command line CLcount = 1; while (CLcount < ac) { if (0 == strncmp (av[CLcount], "-f", 2)) // A file parameter? { content = GetConfigFileContent (av[CLcount+1]); printf ("Parsing Configfile %s", av[CLcount+1]); ParseContent (content, strlen (content)); printf ("\n"); free (content); CLcount += 2; } else { if (0 == strncmp (av[CLcount], "-p", 2)) // A config change? { // Collect all data until next parameter (starting with -<x> (x is any character)), // put it into content, and parse content. CLcount++; ContentLen = 0; NumberParams = CLcount; // determine the necessary size for content while (NumberParams < ac && av[NumberParams][0] != '-') ContentLen += strlen (av[NumberParams++]); // Space for all the strings ContentLen += 1000; // Additional 1000 bytes for spaces and \0s if ((content = malloc (ContentLen))==NULL) no_mem_exit("Configure: content");; content[0] = '\0'; // concatenate all parameters itendified before while (CLcount < NumberParams) { char *source = &av[CLcount][0]; char *destin = &content[strlen (content)]; while (*source != '\0') { if (*source == '=') // The Parser expects whitespace before and after '=' { *destin++=' '; *destin++='='; *destin++=' '; // Hence make sure we add it } else *destin++=*source; source++; } *destin = '\0'; CLcount++; } printf ("Parsing command line string '%s'", content); ParseContent (content, strlen(content)); free (content); printf ("\n"); } else { snprintf (errortext, ET_SIZE, "Error in command line, ac %d, around string '%s', missing -f or -p parameters?", CLcount, av[CLcount]); error (errortext, 300); } } } printf ("\n");#endif /* H26L_LIB */}/*! *********************************************************************** * \brief * allocates memory buf, opens file Filename in f, reads contents into * buf and returns buf * \param Filename * name of config file *********************************************************************** */char *GetConfigFileContent (char *Filename){ unsigned FileSize; FILE *f; char *buf; if (NULL == (f = fopen (Filename, "r"))) { snprintf (errortext, ET_SIZE, "Cannot open configuration file %s.\n", Filename); error (errortext, 300); } if (0 != fseek (f, 0, SEEK_END)) { snprintf (errortext, ET_SIZE, "Cannot fseek in configuration file %s.\n", Filename); error (errortext, 300); } FileSize = ftell (f); if (FileSize < 0 || FileSize > 60000) { snprintf (errortext, ET_SIZE, "Unreasonable Filesize %d reported by ftell for configuration file %s.\n", FileSize, Filename); error (errortext, 300); } if (0 != fseek (f, 0, SEEK_SET)) { snprintf (errortext, ET_SIZE, "Cannot fseek in configuration file %s.\n", Filename); error (errortext, 300); } if ((buf = malloc (FileSize + 1))==NULL) no_mem_exit("GetConfigFileContent: buf"); // Note that ftell() gives us the file size as the file system sees it. The actual file size, // as reported by fread() below will be often smaller due to CR/LF to CR conversion and/or // control characters after the dos EOF marker in the file. FileSize = fread (buf, 1, FileSize, f); buf[FileSize] = '\0'; fclose (f); return buf;}/*! *********************************************************************** * \brief * Parses the character array buf and writes global variable input, which is defined in * configfile.h. This hack will continue to be necessary to facilitate the addition of * new parameters through the Map[] mechanism (Need compiler-generated addresses in map[]). * \param buf * buffer to be parsed * \param bufsize * buffer size of buffer *********************************************************************** */void ParseContent (char *buf, int bufsize){ char *items[MAX_ITEMS_TO_PARSE]; int MapIdx; int item = 0; int InString = 0, InItem = 0; char *p = buf; char *bufend = &buf[bufsize];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -