⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 params.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
   *                    would have been read by Parse().  Unlike a comment   *                    line or a section header, there is no lead-in   *                    character that can be discarded.   *   *  Output: true if the parameter name and value were scanned and processed   *          successfully, else false.   *   *  Notes:  This function is in two parts.  The first loop scans the   *          parameter name.  Internal whitespace is compressed, and an   *          equal sign (=) terminates the token.  Leading and trailing   *          whitespace is discarded.  The second loop scans the parameter   *          value.  When both have been successfully identified, they are   *          passed to pfunc() for processing.   *   * ------------------------------------------------------------------------ **   */  {  int   i       = 0;    /* Position within bufr. */  int   end     = 0;    /* bufr[end] is current end-of-string. */  int   vstart  = 0;    /* Starting position of the parameter value. */  const char *func    = "params.c:Parameter() -";  /* Read the parameter name. */  while( 0 == vstart )  /* Loop until we've found the start of the value. */    {    if( i > (InFile->bSize - 2) )       /* Ensure there's space for next char.    */      {      char *tb;            tb = talloc_realloc(InFile, InFile->bufr, char, InFile->bSize + BUFR_INC );      if( NULL == tb )        {        DEBUG(0, ("%s Memory re-allocation failure.", func) );        return( false );        }      InFile->bufr = tb;      InFile->bSize += BUFR_INC;      }    switch( c )      {      case '=':                 /* Equal sign marks end of param name. */        if( 0 == end )              /* Don't allow an empty name.      */          {          DEBUG(0, ("%s Invalid parameter name in config. file.\n", func ));          return( false );          }        InFile->bufr[end++] = '\0';         /* Mark end of string & advance.   */        i       = end;              /* New string starts here.         */        vstart  = end;              /* New string is parameter value.  */        InFile->bufr[i] = '\0';             /* New string is nul, for now.     */        break;      case '\n':                /* Find continuation char, else error. */        i = Continuation( InFile->bufr, i );        if( i < 0 )          {          InFile->bufr[end] = '\0';          DEBUG(1,("%s Ignoring badly formed line in configuration file: %s\n",                   func, InFile->bufr ));          return( true );          }        end = ( (i > 0) && (' ' == InFile->bufr[i - 1]) ) ? (i - 1) : (i);        c = mygetc( InFile );       /* Read past eoln.                   */        break;      case '\0':                /* Shouldn't have EOF within param name. */      case EOF:        InFile->bufr[i] = '\0';        DEBUG(1,("%s Unexpected end-of-file at: %s\n", func, InFile->bufr ));        return( true );      default:        if( isspace( c ) )     /* One ' ' per whitespace region.       */          {          InFile->bufr[end] = ' ';          i = end + 1;          c = EatWhitespace( InFile );          }        else                   /* All others verbatim.                 */          {          InFile->bufr[i++] = c;          end = i;          c = mygetc( InFile );          }      }    }  /* Now parse the value. */  c = EatWhitespace( InFile );  /* Again, trim leading whitespace. */  while( (EOF !=c) && (c > 0) )    {    if( i > (InFile->bSize - 2) )       /* Make sure there's enough room. */      {      char *tb;            tb = talloc_realloc(InFile, InFile->bufr, char, InFile->bSize + BUFR_INC );      if( NULL == tb )        {        DEBUG(0, ("%s Memory re-allocation failure.", func) );        return( false );        }      InFile->bufr = tb;      InFile->bSize += BUFR_INC;      }    switch( c )      {      case '\r':              /* Explicitly remove '\r' because the older */        c = mygetc( InFile );   /* version called fgets_slash() which also  */        break;                /* removes them.                            */      case '\n':              /* Marks end of value unless there's a '\'. */        i = Continuation( InFile->bufr, i );        if( i < 0 )          c = 0;        else          {          for( end = i; (end >= 0) && isspace((int)InFile->bufr[end]); end-- )            ;          c = mygetc( InFile );          }        break;      default:               /* All others verbatim.  Note that spaces do */        InFile->bufr[i++] = c;       /* not advance <end>.  This allows trimming  */        if( !isspace( c ) )  /* of whitespace at the end of the line.     */          end = i;        c = mygetc( InFile );        break;      }    }  InFile->bufr[end] = '\0';          /* End of value. */  return( pfunc( InFile->bufr, &InFile->bufr[vstart], userdata ) );   /* Pass name & value to pfunc().  */  } /* Parameter */static bool Parse( myFILE *InFile,                   bool (*sfunc)(const char *, void *),                   bool (*pfunc)(const char *, const char *, void *),				   void *userdata )  /* ------------------------------------------------------------------------ **   * Scan & parse the input.   *   *  Input:  InFile  - Input source.   *          sfunc   - Function to be called when a section name is scanned.   *                    See Section().   *          pfunc   - Function to be called when a parameter is scanned.   *                    See Parameter().   *   *  Output: true if the file was successfully scanned, else false.   *   *  Notes:  The input can be viewed in terms of 'lines'.  There are four   *          types of lines:   *            Blank      - May contain whitespace, otherwise empty.   *            Comment    - First non-whitespace character is a ';' or '#'.   *                         The remainder of the line is ignored.   *            Section    - First non-whitespace character is a '['.   *            Parameter  - The default case.   *    * ------------------------------------------------------------------------ **   */  {  int    c;  c = EatWhitespace( InFile );  while( (EOF != c) && (c > 0) )    {    switch( c )      {      case '\n':                        /* Blank line. */        c = EatWhitespace( InFile );        break;      case ';':                         /* Comment line. */      case '#':        c = EatComment( InFile );        break;      case '[':                         /* Section Header. */        if( !Section( InFile, sfunc, userdata ) )          return( false );        c = EatWhitespace( InFile );        break;      case '\\':                        /* Bogus backslash. */        c = EatWhitespace( InFile );        break;      default:                          /* Parameter line. */        if( !Parameter( InFile, pfunc, c, userdata ) )          return( false );        c = EatWhitespace( InFile );        break;      }    }  return( true );  } /* Parse */static myFILE *OpenConfFile( const char *FileName )  /* ------------------------------------------------------------------------ **   * Open a configuration file.   *   *  Input:  FileName  - The pathname of the config file to be opened.   *   *  Output: A pointer of type (char **) to the lines of the file   *   * ------------------------------------------------------------------------ **   */  {  const char *func = "params.c:OpenConfFile() -";  myFILE *ret;  ret = talloc(talloc_autofree_context(), myFILE);  if (!ret) return NULL;  ret->buf = file_load(FileName, &ret->size, ret);  if( NULL == ret->buf )    {    DEBUG( 1,      ("%s Unable to open configuration file \"%s\":\n\t%s\n",      func, FileName, strerror(errno)) );    talloc_free(ret);    return NULL;    }  ret->p = ret->buf;  ret->bufr = NULL;  ret->bSize = 0;  return( ret );  } /* OpenConfFile */bool pm_process( const char *FileName,                 bool (*sfunc)(const char *, void *),                 bool (*pfunc)(const char *, const char *, void *),				 void *userdata)  /* ------------------------------------------------------------------------ **   * Process the named parameter file.   *   *  Input:  FileName  - The pathname of the parameter file to be opened.   *          sfunc     - A pointer to a function that will be called when   *                      a section name is discovered.   *          pfunc     - A pointer to a function that will be called when   *                      a parameter name and value are discovered.   *   *  Output: TRUE if the file was successfully parsed, else FALSE.   *   * ------------------------------------------------------------------------ **   */  {  int   result;  myFILE *InFile;  const char *func = "params.c:pm_process() -";  InFile = OpenConfFile( FileName );          /* Open the config file. */  if( NULL == InFile )    return( false );  DEBUG( 3, ("%s Processing configuration file \"%s\"\n", func, FileName) );  if( NULL != InFile->bufr )                          /* If we already have a buffer */    result = Parse( InFile, sfunc, pfunc, userdata );   /* (recursive call), then just */                                              /* use it.                     */  else                                        /* If we don't have a buffer   */    {                                         /* allocate one, then parse,   */    InFile->bSize = BUFR_INC;                         /* then free.                  */    InFile->bufr = talloc_array(InFile, char, InFile->bSize );    if( NULL == InFile->bufr )      {      DEBUG(0,("%s memory allocation failure.\n", func));      myfile_close(InFile);      return( false );      }    result = Parse( InFile, sfunc, pfunc, userdata );    InFile->bufr  = NULL;    InFile->bSize = 0;    }  myfile_close(InFile);  if( !result )                               /* Generic failure. */    {    DEBUG(0,("%s Failed.  Error returned from params.c:parse().\n", func));    return( false );    }  return( true );                             /* Generic success. */  } /* pm_process *//* -------------------------------------------------------------------------- */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -