/* proj2start.c  P. Conrad CISC105  Fall 2005 */
/* starter file for project 2 */

#include <stdio.h>
#include <string.h> /* for strtok, strncpy */
#include <stdlib.h> /* for atof() */

#define HIKING_TRAIL_NAME_LEN 30 /* max length of hiking trail name */
#define FILENAME_LEN 128  /* maximum length of filename */
#define MAXLINE 1024 /* maximum length of input line in file */


/* function prototypes */

char readOneChar(void);
void printPrompt(void);
void readOneLineFromFile(char *hikingTrailName,
			  double *hikingTrailLengthInMiles);

void printHelp(void);

/* Ask about this "const" in lecture */

void   printValues(const char *hikingTrailName,
		   const double hikingTrailLengthInMiles);


/***************** MAIN PROGRAM **************/

int main(void)
{
  /* declare variables */

  char hikingTrailName[HIKING_TRAIL_NAME_LEN]; 
  double hikingTrailLengthInMiles;

  char c; /* menu option */
  
  /* main menu */

  printPrompt();
  c = readOneChar();
  while (c!='q' && c!='Q')  /* while user didn't select quit */
    {
      switch(c)
	{
	case 'h':
	case 'H':
	  printHelp();
	  break;

	case 'r':
	case 'R':
	  /* read one line from the file and store the result
	     into the character array hikingTrailName, and the
	     double value hikingTrailLengthInMiles */

	  readOneLineFromFile(hikingTrailName,
			      &hikingTrailLengthInMiles);
	  break;
	    
	case 'p':
	case 'P':
	  printValues(hikingTrailName,
		     hikingTrailLengthInMiles);
	  break;
	    
	default:
	  printf("I don't understand the option: %c\n",c);
	  break;
	  
	}
      printPrompt();
      c = readOneChar();

    } /* end while */

  printf("Thanks for using this program.\n");
  printf("Bye now.\n");

}


void printHelp(void)
{
  printf("\n");
  printf(" h: help\n");
  printf(" p: print values\n");
  printf(" q: quit\n");
  printf(" r: read values\n");
  printf("\n");

}

void printPrompt(void)
{
  printf("Enter option (type h for help): ");
}

char readOneChar(void)
{
  char c;
  fflush(stdin);
  scanf("%c",&c);
  return c;
}



void  readOneLineFromFile(char *hikingTrailName,
			  double *hikingTrailLengthInMiles)
{
  
  char filename[FILENAME_LEN];
  char inputLine[MAXLINE];
  FILE *infile;

  char *result; /* for result of fgets */

  char *hikingTrailNamePtr;
  char *hikingTrailLengthPtr;

  printf("Please enter a filename: ");
  fflush(stdin);
  scanf("%s",&filename); /* &filename is redundant;ask about this in lecture!*/
  
  infile = fopen(filename, "r");

  /* check whether file opened properly */

  if (infile == NULL)
    {
      perror(filename);
      fprintf(stderr,"Can't open %s\n", filename);
      
      /* set the values to empty string, and zero */

      hikingTrailName[0] = '\0';
      *hikingTrailLengthInMiles = 0.0;
      fclose(infile); /* close the input file */
      return;
 
    }

  /* read one line from the file */

  result = fgets(inputLine, MAXLINE, infile);
  
  if (result == NULL)
    {
      fprintf(stderr,"Can't read data from %s\n", filename);
      
      /* set the values to empty string, and zero */

      hikingTrailName[0] = '\0';
      *hikingTrailLengthInMiles = 0.0;
      fclose(infile); /* close the input file */
      return;
    }
  
  /* divide up the string at the commas;
     requires #include <string.h>.  Ask about this in lecture */

  hikingTrailNamePtr = strtok(inputLine,",");
  hikingTrailLengthPtr = strtok(NULL,",");

  /* store the results in the output parameters */

  strncpy(hikingTrailName,hikingTrailNamePtr,HIKING_TRAIL_NAME_LEN);
  (*hikingTrailLengthInMiles) = atof(hikingTrailLengthPtr);

  printf("Data read successfully from file\n");

  /* close the input file */

  fclose(infile);

  return;
  
}




void   printValues(const char *hikingTrailName,
		   const double hikingTrailLengthInMiles)
{
  printf("\n");
  printf("  hiking trail name: %s\n",hikingTrailName);
  printf("    length in miles: %6.1lf miles\n",hikingTrailLengthInMiles);
  printf("\n");
  
}




