This is htextio.c in view mode; [Download] [Up]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "hippo.h"
#include "hutil.h"
GLOB_QUAL const char htextio_c_rcsid[] =
"$Id: htextio.c,v 5.0 1993/08/17 21:56:44 rensing Exp $";
static char *parsestr( char **token );
ntuple h_fileParse(FILE* ifile, ntuple oldnt, int verbose)
{
int i,j;
int n_tok;
int rc;
int nt_dim;
int titleset = 0; /* flags and placemarkers */
int labelsset = 0;
int append;
ntuple thisnt = oldnt; /* to return */
char *line = NULL; /* input strings */
int lineLen = 256;
char *token;
char **tokA;
int n_tokA = 10;
char *title = NULL;
char **label;
float *nt;
int n_col = 10;
if (thisnt != NULL)
{
nt_dim = h_getNtDim(thisnt);
append = 1;
}
else
{
append = nt_dim = 0;
}
line = (char *) malloc( lineLen * sizeof(char) );
tokA = (char **) malloc( n_tokA * sizeof(char *) );
label = (char **) malloc( n_col * sizeof(char *) );
nt = (float *) malloc( n_col * sizeof(float) );
for (i=0; i<n_col; i++) label[i] = NULL;
while (fgets(line,lineLen, ifile) != NULL)
{
while (line[strlen(line)-1] != '\n')
{
lineLen *= 2;
line = (char *) realloc( line, lineLen * sizeof(char) );
if (fgets(&line[strlen(line)],lineLen/2,ifile) == NULL) break;
}
/*
* break lines into tokens by ';'
*/
i = 0;
tokA[i] = strtok(line,";");
while (tokA[i] != NULL)
{
/* first, skip white space */
while (*tokA[i] != '\0' && isspace(*tokA[i])) tokA[i]++;
i++;
if (i>=n_tokA)
{
tokA = (char **)realloc( tokA, (n_tokA+5)*sizeof(char *));
n_tokA += 5;
}
tokA[i] = strtok(NULL,";");
}
n_tok = i;
for (i=0; i<n_tok; i++)
{
if (sscanf(tokA[i],"%f",&nt[0]) == 1)
{
/*
* this is string of numbers.
* read in as many columns as possible.
*/
rc = 1;
token = strtok(tokA[i]," ,\t");
j = 0;
while (token != NULL && rc == 1)
{
if (j>=n_col)
{
n_col += 5;
label = (char **)realloc(label,
n_col*sizeof(char *));
nt = (float *)realloc(nt,
n_col*sizeof(float));
}
if ((rc = sscanf(token,"%f",&nt[j]))
== 1) j++;
token = strtok(NULL," ,\t");
}
if (thisnt == NULL)
{
/*
* create the ntuple.
*/
nt_dim = j;
thisnt = h_new(nt_dim);
if (verbose) fprintf(stderr,
"ntuple dimension = %d\n",
nt_dim);
}
/*
* fill the ntuple.
*/
if (j >= nt_dim)
{
h_arrayFill(thisnt, nt );
if (verbose)
{
for (j=0;j<nt_dim;j++)
fprintf(stderr,"%f ",nt[j]);
fprintf(stderr,"\n");
}
}
}
else
{
/*
* character string
*/
if (! titleset)
{
title = parsestr(&tokA[i]);
if (title != NULL) titleset = 1;
if (verbose && title != NULL)
fprintf(stderr,"title = %s\n",title);
}
else if (! labelsset)
{
j = 0;
while (j == 0 || label[j-1] != NULL)
{
if (j>=n_col)
{
n_col += 5;
label = (char **)
realloc(label,
n_col*sizeof(char *));
nt = (float *)
realloc(nt,
n_col*sizeof(float));
}
label[j] = parsestr(&tokA[i]);
if (verbose && label[j] != NULL)
fprintf(stderr,"label %d = %s\n",
j,label[j]);
j++;
}
if (j > 0) labelsset = 1;
}
}
}
}
if (thisnt == NULL)
{
h_error("h_fileParse: file does contain any tuples");
return NULL;
}
/*
* set the title and labels (must do it late, since ntuple
* may not be defined when title/labels are read in).
*/
if (!append)
{
if (title != NULL) h_setNtTitle( thisnt, title );
for (i=0; i<nt_dim && label[i]!=NULL; i++ )
h_setNtLabel( thisnt, i, label[i]);
}
return thisnt;
}
static char *parsestr( char **token )
{
char *s, *string;
char quote;
while (**token != '\"' && **token != '\'' && **token != '\0') (*token)++;
if (**token == '\0') return NULL;
quote = **token;
(*token)++;
string = *token;
while (**token != quote && **token != '\0') (*token)++;
**token = '\0';
(*token)++;
s = (char *) malloc( (strlen(string)+1) * sizeof(char) );
strcpy(s,string);
return s;
}
int h_nt2text( FILE *outfile, ntuple nt )
{
int i,j;
if (nt == NULL || outfile == NULL) return -1;
if (nt->title != NULL)
fprintf(outfile,"\"%s\"\n", nt->title);
else
fprintf(outfile,"\"\"\n");
for (i=0; i<nt->ndim; i++)
fprintf(outfile,"\"%s\" ", nt->label[i]);
fprintf(outfile,"\n");
for (i=0; i<nt->ndata; i++)
{
for (j=0; j<nt->ndim; j++)
fprintf(outfile,"%g ",nt->data[j][i] );
fprintf(outfile,"\n");
}
return 0;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.