/******************************************************************************
*
* ELMER, A Computational Fluid Dynamics Program.
*
* Copyright 1st April 1995 - , Center for Scientific Computing,
* Finland.
*
* All rights reserved. No part of this program may be used,
* reproduced or transmitted in any form or by any means
* without the written permission of CSC.
*
******************************************************************************/
/*******************************************************************************
*
* String handling user functions.
*
*******************************************************************************
*
* Author: Juha Ruokolainen
*
* Address: Center for Scientific Computing
* Tietotie 6, P.O. BOX 405
* 02101 Espoo, Finland
* Tel. +358 0 457 2723
* Telefax: +358 0 457 2302
* EMail: Juha.Ruokolainen@csc.fi
*
* Date: 30 May 1996
*
* Modified by:
*
* Date of modification:
*
******************************************************************************/
/*
* $Id: str.c,v 1.1.1.1 2005/04/14 13:29:14 vierinen Exp $
*
* $Log: str.c,v $
* Revision 1.1.1.1 2005/04/14 13:29:14 vierinen
* initial matc automake package
*
* Revision 1.2 1998/08/01 12:34:55 jpr
*
* Added Id, started Log.
*
*
*/
#include "elmer/matc.h"
#include "str.h"
VARIABLE *str_sprintf(var) VARIABLE *var;
{
char *fmt = var_to_string(var);
VARIABLE *res;
int i;
if (NEXT(var) != NULL)
{
for(i = 0; i < NCOL(NEXT(var)); i++)
{
str_p[i] = M(NEXT(var),0,i);
}
sprintf(str_pstr, fmt,
str_p[0], str_p[1], str_p[2], str_p[3], str_p[4], str_p[5],
str_p[6], str_p[7], str_p[8], str_p[9], str_p[10], str_p[11],
str_p[12], str_p[13], str_p[14], str_p[15], str_p[16], str_p[17],
str_p[18], str_p[19], str_p[20], str_p[21], str_p[22], str_p[23],
str_p[24], str_p[25], str_p[26], str_p[27], str_p[28], str_p[29]);
}
else
{
sprintf(str_pstr, fmt);
}
FREEMEM(fmt);
res = var_temp_new(TYPE_STRING,1,strlen(str_pstr));
for(i = 0; i < NCOL(res); i++)
{
M(res,0,i) = str_pstr[i];
}
return res;
}
VARIABLE *str_sscanf(var) VARIABLE *var;
{
char *fmt = var_to_string(NEXT(var));
char *str = var_to_string(var);
VARIABLE *res;
int i, got;
got = sscanf(str, fmt,
&str_p[0], &str_p[1], &str_p[2], &str_p[3], &str_p[4], &str_p[5],
&str_p[6], &str_p[7], &str_p[8], &str_p[9], &str_p[10], &str_p[11],
&str_p[12], &str_p[13], &str_p[14], &str_p[15], &str_p[16], &str_p[17],
&str_p[18], &str_p[19], &str_p[20], &str_p[21], &str_p[22], &str_p[23],
&str_p[24], &str_p[25], &str_p[26], &str_p[27], &str_p[28], &str_p[29]);
FREEMEM(str);
FREEMEM(fmt);
res = NULL;
if (got > 0) {
res = var_temp_new(TYPE_DOUBLE,1,got);
for(i = 0; i < got; i++)
{
M(res,0,i) = str_p[i];
}
}
return res;
}
VARIABLE *str_matcvt(var) VARIABLE *var;
{
VARIABLE *res = NULL;
char *type = var_to_string(NEXT(var));
double *d = MATR(var);
int i, rlen;
if (strcmp(type, "float")==0)
{
float *f;
rlen = (MATSIZE(var)/2+7)/8;
res = var_temp_new(TYPE(var), 1, rlen);
f = (float *)MATR(res);
for(i = 0; i < NCOL(var)*NROW(var); i++)
{
*f++ = (float)*d++;
}
}
else if (strcmp(type, "int")==0)
{
int *n;
rlen = (MATSIZE(var)/2+7)/8;
res = var_temp_new(TYPE(var), 1, rlen);
n = (int *)MATR(res);
for(i = 0; i < NCOL(var)*NROW(var); i++)
{
*n++ = (int)*d++;
}
}
else if (strcmp(type, "char")==0)
{
char *c;
rlen = (MATSIZE(var)/8+7)/8;
res = var_temp_new(TYPE(var), 1, rlen);
c = (char *)MATR(res);
for(i = 0; i < NCOL(var)*NROW(var); i++)
{
*c++ = (char)*d++;
}
}
else
{
fprintf(math_err, "matcvt: unknown result type specified.\n");
}
FREEMEM(type);
return res;
}
VARIABLE *str_cvtmat(var) VARIABLE *var;
{
VARIABLE *res = NULL;
double *d;
char *type = var_to_string(NEXT(var));
int i, rlen;
if (strcmp(type, "float")==0)
{
float *f = (float *)MATR(var);
rlen = MATSIZE(var)/4;
res = var_temp_new(TYPE(var), 1, rlen);
d = MATR(res);
for(i = 0; i < rlen; i++)
{
*d++ = (double)*f++;
}
}
else if (strcmp(type, "int")==0)
{
int *n = (int *)MATR(var);
rlen = MATSIZE(var)/4;
res = var_temp_new(TYPE(var), 1, rlen);
d = MATR(res);
for(i = 0; i < rlen; i++)
{
*d++ = (double)*n++;
}
}
else if (strcmp(type, "char")==0)
{
char *c = (char *)MATR(var);
rlen = MATSIZE(var);
res = var_temp_new(TYPE(var), 1, rlen);
d = MATR(res);
for(i = 0; i < rlen; i++)
{
*d++ = (double)*c++;
}
}
else
{
fprintf(math_err, "matcvt: unknown result type specified.\n");
}
FREEMEM(type);
return res;
}
void str_com_init()
{
static char *sprintfHelp =
{
"str = sprintf( fmt[, vec] )\n"
"Return a string formated using fmt and values from vec. A call to\n"
"corresponding C-language function is made.\n\n"
};
static char *sscanfHelp =
{
"vec = sscanf( str,fmt )\n"
"Return values from str using format fmt. A call to corresponding C-language\n"
"function is made.\n\n"
};
static char *matcvtHelp =
{
"special = matcvt( matrix, type )\n"
"Makes a type conversion from MATC matrix double precision array to given\n"
"type, which can be one of the following: \"int\", \"char\" or \"float\"\n\n"
"\n"
"SEE ALSO: cvtmat, fwrite\n"
};
static char *cvtmatHelp =
{
"matrix = cvtmat( special, type )\n"
"Makes a type conversion from given type to MATC matrix.\n"
"Type can be one of the following: \"int\", \"char\" or \"float\".\n\n"
"\n"
"SEE ALSO: fread, matcvt.\n"
};
com_init( "sprintf", FALSE, TRUE, str_sprintf, 1, 2, sprintfHelp );
com_init( "sscanf", FALSE, TRUE, str_sscanf, 2, 2, sscanfHelp );
com_init( "matcvt", FALSE, TRUE, str_matcvt, 2, 2, matcvtHelp );
com_init( "cvtmat", FALSE, TRUE, str_cvtmat, 2, 2, cvtmatHelp );
}
syntax highlighted by Code2HTML, v. 0.9.1