#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <stdio.h>
#include <string.h>
#include "dataconv.h"
#include "calc.h"
int entrystringdecode(char *is, float *re, float *im){
int i, fn, err;
char *b;
/* Remove initial spaces, it will be usefull later */
b=is; while(b[0]==' ' || b[0]=='\t') b++;
err=0;
for(i=0; i<(int)strlen(b); i++) {
/* If a 'j' is present than swap it with the sign and replace it
with blank, e.g.: "12+j56" --> "12 +56" */
if(b[i]=='j') {
/* Except if 'j' is the first character as in "j78.34" */
if(i!=0) {
b[i]=b[i-1]; b[i-1]=' '; }
else
b[0]=' ';
/* The string is ready to be read by a scanf, but if only one field
is found this mean that it's a pure immaginary number */
if(sscanf(b, "%f %f", re, im)<2) { *im=*re; *re=0; }
break;
}
}
/* If no 'j' are found there may be one or more field separated by
space or tab*/
if(i==(int)strlen(b)) {
if(strlen(b)==0)
err=1;
else
fn=1;
/* Search for field delimiter */
for(i=0; i<(int)strlen(b); i++) {
/* To do better: to detect multiple spaces or tab or trailing ones */
if(b[i]==' ') fn++;
}
switch(fn) {
case 1: /* Single field, a real number */
if(sscanf(b, "%f", re)==0)
err=1;
*im=0; break;
case 2: /* Complex number in polar format */
if(sscanf(b, "%f %f", re, im)==0)
err=1;
polar2rect(re, im); break;
case 3: /* In futuro per le linee (Z0, E, Att) */
break;
default:
err=1;
}
}
return err;
}
/* Decode values of component from string received by dialogwin() */
int componentvaluestringdecode(char *is, float *val0, float *val1,
float *val2, char *place) {
int ni;
char f0[10], f1[10], f2[10], f3[10];
ni=sscanf(is, "%s %s %s %s", f0, f1, f2, f3);
switch(ni) {
case 0: fprintf(stderr, "Invalid component value\n"); return 1;
case 1: *place=' '; *val0=psdec(f0); *val1=0.; *val2=0.; break;
case 2: *place=f1[0]; *val0=psdec(f0); *val1=0.; *val2=0.; break;
case 3: *place=f2[0]; *val0=psdec(f0); *val1=psdec(f1); *val2=0; break;
default: fprintf(stderr, "Invalid component value\n"); return 1;
}
return 0;
}
/* Decode float value with unit of measure prefix (but not unit of measure
symbol) */
float psdec(char *b) {
int i;
float pf=1., v;
char b2[40];
for(i=0; i<(int)strlen(b); i++)
if((b[i]>'9' || b[i]<'0') && b[i]!='.' && b[i]!='-' && b[i]!='+') break;
if(i!=(int)strlen(b))
switch(b[i]) {
case 'f': pf=1.e-15; break;
case 'p': pf=1.e-12; break;
case 'n': pf=1.e-9; break;
case 'u': pf=1.e-6; break;
case 'm': pf=1.e-3; break;
case 'k': pf=1.e+3; break;
case 'M': pf=1.e+6; break;
case 'G': pf=1.e+9; break;
case 'T': pf=1.e+12; break;
case ' ': pf=1.; break;
default: fprintf(stderr, "Invalid prefix (%c)\n", b[i]); return(0.);
}
strncpy(b2, b, i+2);
sscanf(b2, "%f", &v);
return (v*pf);
}
syntax highlighted by Code2HTML, v. 0.9.1