[cig-commits] r18465 - seismo/2D/SPECFEM2D/trunk/src/shared
dkomati1 at geodynamics.org
dkomati1 at geodynamics.org
Wed May 25 13:13:34 PDT 2011
Author: dkomati1
Date: 2011-05-25 13:13:34 -0700 (Wed, 25 May 2011)
New Revision: 18465
Modified:
seismo/2D/SPECFEM2D/trunk/src/shared/param_reader.c
Log:
updated param_reader.c to allow for multi words when reading a string
Modified: seismo/2D/SPECFEM2D/trunk/src/shared/param_reader.c
===================================================================
--- seismo/2D/SPECFEM2D/trunk/src/shared/param_reader.c 2011-05-25 20:11:38 UTC (rev 18464)
+++ seismo/2D/SPECFEM2D/trunk/src/shared/param_reader.c 2011-05-25 20:13:34 UTC (rev 18465)
@@ -45,9 +45,10 @@
/*
- by Dennis McRitchie (Princeton University, USA)
+by Dennis McRitchie (Princeton University, USA)
January 7, 2010 - par_file parsing
+ May 25, 2011 - Updated to support multi-word values
..
You'll notice that the heart of the parser is a complex regular
expression that is compiled within the C code, and then used to split
@@ -63,7 +64,7 @@
already six C files that make up part of the build (though they all are
related to the pyre-framework).
..
- */
+*/
#define _GNU_SOURCE
#include "config.h"
@@ -128,8 +129,6 @@
fclose(fid);
}
-
-// Parses file to read in parameter
void
FC_FUNC_(param_read,PARAM_READ)(char * string_read, int * string_read_len, char * name, int * name_len, int * ierr)
{
@@ -159,16 +158,15 @@
}
/* Regular expression for parsing lines from param file.
** Good luck reading this regular expression. Basically, the lines of
- ** the parameter file should be of the form 'parameter = value'. Blank
+ ** the parameter file should be of the form 'parameter = value',
+ ** optionally followed by a #-delimited comment.
+ ** 'value' can be any number of space- or tab-separated words. Blank
** lines, lines containing only white space and lines whose first non-
** whitespace character is '#' are ignored. White space is generally
** ignored. As you will see later in the code, if both parameter and
** value are not specified the line is ignored.
*/
- // line must include a "=" character and end with a comment
- //char pattern[] = "^[ \t]*([^# \t]*)[ \t]*=[ \t]*([^# \t]*)[ \t]*(#.*){0,1}$";
- // line must include a "=" character (no need to end with a comment)
- char pattern[] = "^[ \t]*([^# \t]*)[ \t]*=[ \t]*([^# \t]*)[ \t]*";
+ char pattern[] = "^[ \t]*([^# \t]+)[ \t]*=[ \t]*([^# \t]+([ \t]+[^# \t]+)*)";
// Compile the regular expression.
status = regcomp(&compiled_pattern, pattern, REG_EXTENDED);
@@ -203,15 +201,9 @@
regfree(&compiled_pattern);
return;
}
- //printf("Line read: %s\n", line);
- //keyword = strndup(line+parameter[0].rm_so, parameter[0].rm_eo-parameter[0].rm_so);
- //printf("string 0: %s\n", keyword);
- //free(keyword);
-
+ // printf("Line read = %s\n", line);
// If we have a match, extract the keyword from the line.
keyword = strndup(line+parameter[1].rm_so, parameter[1].rm_eo-parameter[1].rm_so);
- //printf("keyword: %s\n", keyword);
-
// If the keyword is not the one we're looking for, check the next line.
if (strcmp(keyword, namecopy2) != 0) {
free(keyword);
@@ -221,260 +213,19 @@
regfree(&compiled_pattern);
// If it matches, extract the value from the line.
value = strndup(line+parameter[2].rm_so, parameter[2].rm_eo-parameter[2].rm_so);
- //printf("value: %s\n", value);
-
// Clear out the return string with blanks, copy the value into it, and return.
memset(string_read, ' ', *string_read_len);
strncpy(string_read, value, strlen(value));
+ // printf("'%s'='%s'\n", namecopy2, value);
free(value);
free(namecopy);
*ierr = 0;
return;
}
// If no keyword matches, print out error and die.
- printf("No match in parameter file for keyword %s\n", namecopy2);
+ printf("No match in parameter file for keyword '%s'\n", namecopy);
free(namecopy);
regfree(&compiled_pattern);
*ierr = 1;
return;
}
-
-
-// reads next line in file to read in parameters without need of given parameter name
-void
-FC_FUNC_(param_read_nextparam,PARAM_READ_NEXTPARAM)(char * string_read, int * string_read_len, char * name, int * name_len, int * ierr)
-{
- char * namecopy;
- char * blank;
- char * namecopy2;
- int status;
- regex_t compiled_pattern;
- char line[LINE_MAX];
- int regret;
- regmatch_t parameter[3];
- char * keyword;
- char * value;
-
- // Trim the keyword name we're looking for.
- namecopy = strndup(name, *name_len);
- blank = strchr(namecopy, ' ');
- if (blank != NULL) {
- namecopy[blank - namecopy] = '\0';
- }
- // Then get rid of any dot-terminated prefix.
- namecopy2 = strchr(namecopy, '.');
- if (namecopy2 != NULL) {
- namecopy2 += 1;
- } else {
- namecopy2 = namecopy;
- }
-
- /* Regular expression for parsing lines from param file.
- ** Good luck reading this regular expression. Basically, the lines of
- ** the parameter file should be of the form 'parameter = value'. Blank
- ** lines, lines containing only white space and lines whose first non-
- ** whitespace character is '#' are ignored. White space is generally
- ** ignored. As you will see later in the code, if both parameter and
- ** value are not specified the line is ignored.
- */
- // line must include a "=" character and end with a comment
- //char pattern[] = "^[ \t]*([^# \t]*)[ \t]*=[ \t]*([^# \t]*)[ \t]*(#.*){0,1}$";
- // line must include a "=" character (no need to end with a comment
- char pattern[] = "^[ \t]*([^# \t]*)[ \t]*=[ \t]*([^# \t]*)[ \t]*";
-
- // Compile the regular expression.
- status = regcomp(&compiled_pattern, pattern, REG_EXTENDED);
- if (status != 0) {
- printf("regcomp returned error %d\n", status);
- }
-
- // skips this... takes current position where file pointer is now...
- /*
- // Position the open file to the beginning.
- if (fseek(fid, 0, SEEK_SET) != 0) {
- printf("Can't seek to begining of parameter file\n");
- *ierr = 1;
- regfree(&compiled_pattern);
- return;
- }
- */
-
- // Read every line in the file.
- while (fgets(line, LINE_MAX, fid) != NULL) {
- // Get rid of the ending newline.
- int linelen = strlen(line);
- if (line[linelen-1] == '\n') {
- line[linelen-1] = '\0';
- }
- /* Test if line matches the regular expression pattern, if so
- ** return position of keyword and value */
- regret = regexec(&compiled_pattern, line, 3, parameter, 0);
- // If no match, check the next line.
- if (regret == REG_NOMATCH) {
- continue;
- }
- // If any error, bail out with an error message.
- if(regret != 0) {
- printf("regexec returned error %d\n", regret);
- *ierr = 1;
- regfree(&compiled_pattern);
- return;
- }
- //printf("Line nextparam read: %s\n", line);
-
- // If we have a match, extract the keyword from the line.
- keyword = strndup(line+parameter[1].rm_so, parameter[1].rm_eo-parameter[1].rm_so);
- //printf("keyword: %s\n", keyword);
-
- // If the keyword is not the one we're looking for, return with an error.
- if (strcmp(keyword, namecopy2) != 0) {
- printf("keyword returned wrong parameter %s instead of %s \n", keyword,namecopy2);
- free(keyword);
- *ierr = 1;
- regfree(&compiled_pattern);
- return;
- }
- free(keyword);
- regfree(&compiled_pattern);
-
- // If it matches, extract the value from the line.
- value = strndup(line+parameter[2].rm_so, parameter[2].rm_eo-parameter[2].rm_so);
- //printf("value: %s\n", value);
-
- // Clear out the return string with blanks, copy the value into it, and return.
- memset(string_read, ' ', *string_read_len);
- strncpy(string_read, value, strlen(value));
- free(value);
- free(namecopy);
- *ierr = 0;
- return;
- }
- // If no next line matches, print out error and die.
- printf("No match in parameter file for %s on next line \n",namecopy2);
- //free(namecopy);
- regfree(&compiled_pattern);
- *ierr = 1;
- return;
-}
-
-
-// reads next line in file to read in parameters without need of given parameter name
-void
-FC_FUNC_(param_read_nextline,PARAM_READ_NEXTLINE)(char * string_read, int * string_read_len, int * ierr)
-{
- //char * namecopy;
- //char * blank;
- //char * namecopy2;
- int status;
- regex_t compiled_pattern;
- char line[LINE_MAX];
- int regret;
- regmatch_t parameter[1];
- //char * keyword;
- char * value;
-
- // no parameter name appears on this line ...
- /*
- // Trim the keyword name we're looking for.
- namecopy = strndup(name, *name_len);
- blank = strchr(namecopy, ' ');
- if (blank != NULL) {
- namecopy[blank - namecopy] = '\0';
- }
- // Then get rid of any dot-terminated prefix.
- namecopy2 = strchr(namecopy, '.');
- if (namecopy2 != NULL) {
- namecopy2 += 1;
- } else {
- namecopy2 = namecopy;
- }
- */
-
- /* Regular expression for parsing lines from param file.
- ** Good luck reading this regular expression. Basically, the lines of
- ** the parameter file should be of the form 'parameter = value'. Blank
- ** lines, lines containing only white space and lines whose first non-
- ** whitespace character is '#' are ignored. White space is generally
- ** ignored. As you will see later in the code, if both parameter and
- ** value are not specified the line is ignored.
- */
- // line must include a "=" character and end with a comment
- //char pattern[] = "^[ \t]*([^# \t]*)[ \t]*=[ \t]*([^# \t]*)[ \t]*(#.*){0,1}$";
- // line must include a "=" character (no need to end with a comment)
- //char pattern[] = "^[ \t]*([^# \t]*)[ \t]*=[ \t]*([^# \t]*)[ \t]*";
- // line must include numbers
- char pattern[] = "^[ \t]*[^# \t][0-9]*";
-
- // Compile the regular expression.
- status = regcomp(&compiled_pattern, pattern, REG_EXTENDED);
- if (status != 0) {
- printf("regcomp returned error %d\n", status);
- }
-
- // skips this... takes current position where file pointer is now...
- /*
- // Position the open file to the beginning.
- if (fseek(fid, 0, SEEK_SET) != 0) {
- printf("Can't seek to begining of parameter file\n");
- *ierr = 1;
- regfree(&compiled_pattern);
- return;
- }
- */
-
- // Read every line in the file.
- while (fgets(line, LINE_MAX, fid) != NULL) {
- // Get rid of the ending newline.
- int linelen = strlen(line);
- if (line[linelen-1] == '\n') {
- line[linelen-1] = '\0';
- }
- /* Test if line matches the regular expression pattern, if so
- ** return position of keyword and value */
- regret = regexec(&compiled_pattern, line, 1, parameter, 0);
- // If no match, check the next line.
- if (regret == REG_NOMATCH) {
- continue;
- }
- // If any error, bail out with an error message.
- if(regret != 0) {
- printf("regexec returned error %d\n", regret);
- *ierr = 1;
- regfree(&compiled_pattern);
- return;
- }
- //printf("Line nextline read: %s\n", line);
-
- // no comparison with parameter needed
- /*
- // If we have a match, extract the keyword from the line.
- keyword = strndup(line+parameter[1].rm_so, parameter[1].rm_eo-parameter[1].rm_so);
-
- // If the keyword is not the one we're looking for, check the next line.
- if (strcmp(keyword, namecopy2) != 0) {
- free(keyword);
- continue;
- }
- free(keyword);
- */
- regfree(&compiled_pattern);
-
- // If it matches, extract the value from the line.
- value = strndup(line+parameter[0].rm_so, strlen(line));
- //printf("value: %s\n", value);
-
- // Clear out the return string with blanks, copy the value into it, and return.
- memset(string_read, ' ', *string_read_len);
- strncpy(string_read, value, strlen(value));
- free(value);
- //free(namecopy);
- *ierr = 0;
- return;
- }
- // If no next line matches, print out error and die.
- printf("No match in parameter file for next line \n");
- //free(namecopy);
- regfree(&compiled_pattern);
- *ierr = 1;
- return;
-}
More information about the CIG-COMMITS
mailing list