Google Answers Logo
View Question
 
Q: parser code for a program..c programming ( Answered 5 out of 5 stars,   0 Comments )
Question  
Subject: parser code for a program..c programming
Category: Computers > Programming
Asked by: derekwtp-ga
List Price: $10.00
Posted: 24 Apr 2003 12:22 PDT
Expires: 24 May 2003 12:22 PDT
Question ID: 194927
I was wondering if any of you pro's would like to help me write a
parser code for my program..here is an example of the code from my
instructor: I would really like to learn so can you use comments when
you help me

parser example

[root@win186821wks c]# more parser.c 
main(int argc, char** argv) 
{ 
int age,month,maxargs,i; 
char name[80]; 
 
/*(NOTE:  this may look overkill but please notice how easy 
        it will be to add another command line option, or to 
        add another 50 options!  If there is something 
        you don't undestand, please mail me questions. 
        I added the "main" stuff above and the printf() 
        at the end, just so you can compile and run the 
        program to see how it works. 
*/ 
/* 
current command line arguments: 
 
         -n name          User's first name ("Sean" is default) 
         -m month         integer month (default is "1" for January) 
         -a age           integer age (default is "39" :) ) 
*/ 
 
 maxargs = 7; 
 
/* check for too many command line arguments */ 
 if (argc > maxargs) { 
   printf("Usage:  %s [-n name -m month -a age ]\n",argv[0]); 
   exit(1); 
 } 
 
/* set default values */ 
 strcpy(name,"Sean"); 
 month = 1; 
 age = 39; 
 
 for (i=1;i<argc;i+=2) { 
 
/* check for valid flags (first char should be '-' for flags) */ 
   if (argv[i][0]!='-') { 
     printf("bad option character...should be \"-\"\n"); 
     exit(2); 
   } 
 
/* check for valid flag value and take appropriate action */ 
   switch (argv[i][1]) { 
      case 'n': strcpy(name,argv[i+1]); 
                break; 
      case 'm': month = atoi(argv[i+1]); 
                break; 
      case 'a': age = atoi(argv[i+1]); 
                break; 
       default: printf("bad option...should be \"n\" or \"m\" or
\"a\"\n");
                exit(3); 
                break; 
   } 
 } 
printf("age = %d, month = %d, name = %s\n",age,month,name); 
}



and here is an example of my code:

#include <stdio.h> 
#include <stdlib.h> 
 
main(int argc, char *argv[]) 
{ 
 
  double sum_intensities = 0; 
  int   total_values = 0; 
  int   total_nonzero_values = 0; 
  double   avg_values = 0; 
  double   avg_nonzero = 0; 
 
  float new_value[400]; 
  int   result; 
  FILE  *datafile; 
 
  char  *filename; 
  int   img_rows; 
  int   i; 
  int   size; 
 
  /* SET THE filename VARIABLE */ 
 
   
  filename=(argv[1]); 
  img_rows=(atoi(argv[2])); 
  size = (img_rows*img_rows); 
 
 
 
 
  /* open the file */ 
  datafile = fopen(filename, "r"); 
 
  /* this is the  loop. */ 
  result = 1; 
 
 
    /* fread will return 0 on error or end of file. */ 
    result = fread(&new_value, sizeof(float), size, datafile); 
 
 
    
  for (i = 0; i < size; i++) { 
 
    
    
    /* update the statistics with the new value in new_value */ 
    if (result == size) { 
      total_values++; 
      sum_intensities += new_value[i]; 
            if (new_value[i] > 0) { 
        total_nonzero_values++; 
      } 
    } 
    else { 
      printf("invalid file format (result = '%d')\n", result); 
      exit(0); 
    }     
 
 
  } 
  avg_values= sum_intensities / total_values; 
  avg_nonzero= sum_intensities / total_nonzero_values; 
  printf ("avg_values %e\n",avg_values); 
  printf ("avg_nonzero %e\n",avg_nonzero); 
  printf ("total_values %e\n",total_values); 
  printf ("total_nonzero_values %e\n",total_nonzero_values); 
 
 
}
Answer  
Subject: Re: parser code for a program..c programming
Answered By: dogbite-ga on 24 Apr 2003 13:02 PDT
Rated:5 out of 5 stars
 
Hey derekwtp-ga,

  Okay, here is a stab at the parser code.  It
  allows you to set either the filename or the
  number of image rows.  If they are not specified,
  it sets default values.

              dogbite-ga




#include <stdio.h>
#include <stdlib.h>


/* a structure to hold our arguments */
struct arguments {
  char  filename[1024];     /* the -f option */
  int   img_rows;           /* the -n option */
};


/*****************************************
 * Function: parseArguments
 * Inputs:   a structure to hold the argument values, and
 *           the number of args on the command line, and
 *           a list of those arguments
 * Notes:    populate the arguments structure
 *****************************************/
void parseArguments(struct arguments *arguments, int argc, char *argv[]) {
  int maxargs = 5;
  int i;

  /* check for too many arguments */
  if (argc > maxargs) {
    printf("Usage: %s [-f imagefile -n imagerows]\n", argv[0]);
    exit(1);
  }

  /* first set default values */
  strcpy(arguments->filename, "image.001");
  arguments->img_rows = 10;

  /* now loop through the command line args */
  for (i = 1; i < argc; i += 2) {

    /* check if the first character is a dash.  i.e. -f or -n */
    if (argv[i][0] != '-') {
      printf("bad option character...should be \"-\"\n");
      exit(2);
    }

    /* check for valid flag value and take appropriate action */
    switch (argv[i][1]) {
    case 'n': arguments->img_rows = atoi(argv[i+1]);
      break;
    case 'f': strcpy(arguments->filename,argv[i+1]);
      break;
    default: printf("bad option...should be \"n\" or \"f\"\n");
      exit(3);
      break;
    }
  }

  return;
}


main(int argc, char *argv[])
{

  double sum_intensities = 0;
  int   total_values = 0;
  int   total_nonzero_values = 0;
  double   avg_values = 0;
  double   avg_nonzero = 0;

  float new_value[400];
  int   result;
  FILE  *datafile;

  int   i;
  int   size;


  /* declare and allocate memory for the structure */
  struct arguments *myargs;
  myargs = malloc(sizeof(struct arguments));

  /* set the arguments based on command line options */
  parseArguments(myargs, argc, argv);

  /* calculate the size of the square image */
  size = (myargs->img_rows * myargs->img_rows);


  /* open the file */
  datafile = fopen(myargs->filename, "r");
  if (datafile == NULL) {
    printf("Could not open file '%s'\n", myargs->filename);
    exit(4);
  }


  result = 1;

  /* fread will return 0 on error or end of file. */
  result = fread(&new_value, sizeof(float), size, datafile);


  for (i = 0; i < size; i++) {

    /* update the statistics with the new value in new_value */
    if (result == size) {
      total_values++;
      sum_intensities += new_value[i];
      if (new_value[i] > 0) {
        total_nonzero_values++;
      }
    }
    else {
      printf("invalid file format (result = '%d')\n", result);
      exit(0);
    }


  }
  avg_values= sum_intensities / total_values;
  avg_nonzero= sum_intensities / total_nonzero_values;
  printf ("avg_values %e\n",avg_values);
  printf ("avg_nonzero %e\n",avg_nonzero);
  printf ("total_values %e\n",total_values);
  printf ("total_nonzero_values %e\n",total_nonzero_values);

  free(myargs);
}
derekwtp-ga rated this answer:5 out of 5 stars and gave an additional tip of: $5.00
Thanks bunches dog

Comments  
There are no comments at this time.

Important Disclaimer: Answers and comments provided on Google Answers are general information, and are not intended to substitute for informed professional medical, psychiatric, psychological, tax, legal, investment, accounting, or other professional advice. Google does not endorse, and expressly disclaims liability for any product, manufacturer, distributor, service or service provider mentioned or any opinion expressed in answers or comments. Please read carefully the Google Answers Terms of Service.

If you feel that you have found inappropriate content, please let us know by emailing us at answers-support@google.com with the question ID listed above. Thank you.
Search Google Answers for
Google Answers  


Google Home - Answers FAQ - Terms of Service - Privacy Policy