view main/system-identification/devel/tisean/source_c/routines/get_series.c @ 9894:82ff20b4d849 octave-forge

system-identitifaction: Adding devel TISEAN files
author jpicarbajal
date Wed, 28 Mar 2012 13:32:37 +0000
parents
children
line wrap: on
line source

/*
 *   This file is part of TISEAN
 *
 *   Copyright (c) 1998-2007 Rainer Hegger, Holger Kantz, Thomas Schreiber
 *
 *   TISEAN is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   TISEAN is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with TISEAN; if not, write to the Free Software
 *   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */
/*Author: Rainer Hegger Last modified: Sep 3, 1999 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tsa.h"
#include "tisean_cec.h"

#define SIZE_STEP 1000
extern void check_alloc(void*);

double *get_series(char *name,unsigned long *l,unsigned long ex,
		unsigned int col,unsigned int verbosity)
{
  char *input,*format;
  int i;
  unsigned long count,allcount,max_size=SIZE_STEP,hl;
  int input_size=INPUT_SIZE;
  double *x;
  FILE *fin;
  
  check_alloc(input=(char*)calloc((size_t)input_size,(size_t)1));
  check_alloc(format=(char*)calloc((size_t)(4*col),(size_t)1));
  strcpy(format,"");
  for (i=1;i<col;i++)
    strcat(format,"%*lf");
  strcat(format,"%lf");
  
  check_alloc(x=(double*)malloc(sizeof(double)*max_size));
  hl= *l;
  
  count=0;
  allcount=0;
  if (name == NULL) {
    for (i=0;i<ex;i++)
      if ((input=myfgets(input,&input_size,stdin,verbosity)) == NULL)
	break;
    while ((count < hl) && 
	   ((input=myfgets(input,&input_size,stdin,verbosity)) != NULL)) {
      if (count == max_size) {
	max_size += SIZE_STEP;
	check_alloc(x=(double*)realloc(x,sizeof(double)*max_size));
      }
      allcount++;
      if (sscanf(input,format,&x[count]) != 1) {
	if (verbosity&VER_INPUT)
	  fprintf(stderr,"Line %lu ignored: %s",allcount,input);
      }
      else
	count++;
      if ((verbosity&VER_FIRST_LINE) && (count == 0))
	fprintf(stderr,"get_series: first data item used:\n%lf\n",x[0]);
    }
  }
  else {
    fin=fopen(name,"r");
    for (i=0;i<ex;i++)
      if ((input=myfgets(input,&input_size,fin,verbosity)) == NULL)
	break;
    while ((count < hl) && 
	   ((input=myfgets(input,&input_size,fin,verbosity)) != NULL)) {
      if (count == max_size) {
	max_size += SIZE_STEP;
	check_alloc(x=(double*)realloc(x,sizeof(double)*max_size));
      }
      allcount++;
      if (sscanf(input,format,&x[count]) != 1) {
	if (verbosity&VER_INPUT)
	  fprintf(stderr,"Line %lu ignored: %s",allcount,input);
      }
      else
	count++;
    }
    fclose(fin);
  }
  free(input);
  
  *l = count;
  if (*l == 0) {
    fprintf(stderr,"0 lines read. It makes no sense to continue. Exiting!\n");
    exit(GET_SERIES_NO_LINES);
  }
  else {
    if (verbosity&VER_INPUT)
      fprintf(stderr,"Use %lu lines.\n",*l);
  }
  if (max_size > count)
    check_alloc(x=(double*)realloc(x,sizeof(double)*count));
  
  return x;
}
#undef SIZE_STEP