Exemplo n.º 1
0
/************************************************************************************************************
 * Function name : get_next_assignment                                                                      *
 *   													    *
 *     INPUT  :	char *filename										    *
 *		unsigned int *exponent									    *
 *		int *bit_min										    *
 *		int *bit_max										    *
 *		char *assignment_key[100];
 *     OUTPUT :                                        							    *
 *                                                                                                          *
 *     0 - OK												    *
 *     1 - get_next_assignment : cannot open file							    *
 *     2 - get_next_assignment : no valid assignment found						    *
 ************************************************************************************************************/
enum ASSIGNMENT_ERRORS get_next_assignment(char *filename, unsigned int *exponent, unsigned int *bit_min, unsigned int *bit_max, LINE_BUFFER *key, int verbosity)
{
  FILE *f_in;
  
  enum PARSE_WARNINGS value;
  struct ASSIGNMENT assignment;
  char *tail;
  LINE_BUFFER line;
  unsigned int linecount=0;

  // first, make sure we have an up-to-date worktodo file
  process_add_file(filename);
  f_in = fopen_and_lock(filename, "r");
  if(f_in == NULL)
  {
    printf("Can't open workfile %s\n", filename);
    return CANT_OPEN_FILE;	// nothing to open...
  }
  for(;;)
  {
    linecount++;
    value = parse_worktodo_line(f_in,&assignment,&line,&tail);
    if ((BLANK_LINE == value) || (NONBLANK_LINE == value))
      continue;
    if (NO_WARNING == value)
    {
      if (valid_assignment(assignment.exponent,assignment.bit_min, assignment.bit_max, verbosity))
        break;
      value = INVALID_DATA;
    }

    if (END_OF_FILE == value)
      break;
    if(verbosity >= 1)
    {
      printf("WARNING: ignoring line %u in \"%s\"! Reason: ", linecount, filename);
      switch(value)
      {
        case LONG_LINE:           printf("line is too long\n"); break;
        case NO_FACTOR_EQUAL:     printf("doesn't begin with Factor=\n");break;
        case INVALID_FORMAT:      printf("invalid format\n");break;
        case INVALID_DATA:        printf("invalid data\n");break;
        default:                  printf("unknown error on >%s<",line); break;
      }
    }
  }

  unlock_and_fclose(f_in);

  if (NO_WARNING == value)
  {
    *exponent = assignment.exponent;
    *bit_min = assignment.bit_min;
    *bit_max = assignment.bit_max;

    if (key!=NULL)strcpy(*key,assignment.assignment_key);

    return OK;
  }
  else
    return VALID_ASSIGNMENT_NOT_FOUND;
}
Exemplo n.º 2
0
Arquivo: parse.c Projeto: ah42/cuda-p1
/************************************************************************************************************
 * Function name : get_next_assignment                                                                      *
 *   													    *
 *     INPUT  :	char *filename										    *
 *		int *exponent										    *
 *		int* fft_length									    	    *
 *		char *hex_key[132];								    	    *
 *     OUTPUT :                                        							    *
 *                                                                                                          *
 *     0 - OK												    *
 *     1 - get_next_assignment : cannot open file							    *
 *     2 - get_next_assignment : no valid assignment found						    *
 ************************************************************************************************************/
enum ASSIGNMENT_ERRORS get_next_assignment(char *filename, int *exponent, int* fft_length, int* tf_depth, int* ll_saved, LINE_BUFFER *key,
		int* b1, int* b2) {
	struct ASSIGNMENT assignment;
	
	FILE *f_in;
	enum PARSE_WARNINGS value;
	char *tail;
	LINE_BUFFER line;
	unsigned int linecount = 0;
	
#ifdef EBUG
	printf("Starting GNA. Called with *fft = %d.\n", *fft_length);
#endif
	
	assignment.fft_length = 0;
	f_in = _fopen(filename, "r");
	if (NULL == f_in) {
//    printf("Can't open workfile %s in %s\n", filename, getcwd(line,sizeof(LINE_BUFFER)) );
		fprintf(stderr, "Can't open workfile %s\n\n", filename);
		return CANT_OPEN_FILE;	// nothing to open...
	}
	do {
		linecount++;
		
		value = parse_worktodo_line(f_in, &assignment, &line, &tail);
		
		if ((BLANK_LINE == value) || (NONBLANK_LINE == value))
			continue;
		if (NO_WARNING == value) {
			if (valid_assignment(assignment.exponent, assignment.fft_length))
				break;
			value = INVALID_DATA;
		}
		
		if (END_OF_FILE == value)
			break;
		fprintf(stderr, "Warning: ignoring line %u: \"%s\" in \"%s\". Reason: ", linecount, line, filename);
		switch (value) {
			case LONG_LINE:
				fprintf(stderr, "line is too long.\n");
				break;
			case NO_TEST_EQUAL:
				fprintf(stderr, "doesn't begin with Test= or DoubleCheck=.\n");
				break;
			case INVALID_FORMAT:
				fprintf(stderr, "invalid format.\n");
				break;
			case INVALID_DATA:
				fprintf(stderr, "invalid data.\n");
				break;
			default:
				fprintf(stderr, "unknown error.\n");
				break;
		}
		
		// if (LONG_LINE != value)
		//	return 2;
	} while (1);
	
	fclose(f_in);
	if (NO_WARNING == value) {
		*exponent = assignment.exponent;
		if (assignment.fft_length > 0)
			*fft_length = assignment.fft_length;
		*tf_depth = assignment.tf_depth;
		
		if (assignment.type == PFACTOR)
			*ll_saved = assignment.ll_saved;
		if (assignment.type == PMINUS1) {
			*b1 = assignment.b1;
			*b2 = assignment.b2;
		}
		
#ifdef EBUG
		printf("Struct fft is %d, *fft_length is %d\n", assignment.fft_length, *fft_length);
#endif
		
		if (key != NULL)
			strcopy(*key, assignment.hex_key, MAX_LINE_LENGTH + 1);
		
		return OK;
	} else
		fprintf(stderr, "No valid assignment found.\n\n");
	return VALID_ASSIGNMENT_NOT_FOUND;
}