[foxboro] Some string routines including string to integer & float conversion
- From: "Mark Chatterton" <Mark.Chatterton@xxxxxxxxxxxx>
- To: <foxboro@xxxxxxxxxxxxx>
- Date: Fri, 7 Dec 2001 09:07:09 -0600
Rory Loupe wrote:
=20
> Mark,
> Could you include this code (text copied into the email) in=20
> an email to the
> list?
They appear below. I have these as separate ".sub" files in the
/opt/fox/ciocfg/sequeninclude directory and #include the ones I need.
Mark Chatterton
General Mills
/opt/fox/ciocfg/sequeninclude/strlen_front.sub
/***
*
* strlen_front - Find length of a string searching from front for first
blank.
*
* Usage: CALL strlen_front (str, len)
*
* where
* str : S =3D input string
* len : I =3D length (character position) of first
* blank character found while searching
* from left to right.
*/
SUBROUTINE strlen_front (IN str : S
INOUT len : I)
STATEMENTS
len :=3D 1;
WHILE len < 81 DO
IF str(len..len) =3D " " THEN EXITLOOP; ENDIF;
len :=3D len + 1;
ENDWHILE;
len :=3D len - 1;
ENDSUBROUTINE
#define _STRLEN_FRONT 1
/opt/fox/ciocfg/sequeninclude/strlen_back.sub
/***
*
* strlen_back - Find length of a string by searching from back for first
* non-blank.
*
* Usage: CALL strlen_back (str, len)
*
* where
* str : S =3D input string
* len : I =3D length (character position) of first
* non-blank character found while
searching
* from right to left. 0 indicates empty
string.
*/
SUBROUTINE strlen_back (IN str : S
INOUT len : I)
STATEMENTS
len :=3D 81;
REPEAT
len :=3D len - 1;
IF len =3D 0 THEN EXITLOOP; ENDIF;
UNTIL (str(len..len) <> " ");
ENDSUBROUTINE
#define _STRLEN_BACK 1
/opt/fox/ciocfg/sequeninclude/findstr.sub
/***
*
* findstr - Find substring
*
* Usage: CALL findstr (str1, str2, pos)
*
* where
* str1 : S =3D string to be searched
* str2 : S =3D substring to search for
* pos : I =3D character position of str2 in str1 or
* 0 if str2 doesn't appear in str1.
*/
#ifndef _STRLEN_BACK
#include <./strlen_back.sub>
#endif
SUBROUTINE findstr (IN str1 : S
IN str2 : S
INOUT pos : I )
VARIABLES
j : I;
STATEMENTS
pos :=3D 0;
CALL strlen_back (str2, j);
IF j=3D0 THEN GOTO a; ENDIF;
j :=3D j - 1;
REPEAT
pos :=3D pos + 1;
IF pos+j > 80 THEN
pos :=3D 0;
EXITLOOP;
ENDIF;
UNTIL str1(pos..pos+j) =3D str2;
<<a>>;
ENDSUBROUTINE
#define _FINDSTR 1
/opt/fox/ciocfg/sequeninclude/strtrim.sub
/***
*
* strtrim - Trim leading whitespace from a string
*
* Usage: CALL strtrim (str)
*
* where
* str : S =3D string to be trimmed
*/
#ifndef _STRLEN_FRONT
#include <./strlen_front.sub>
#endif
SUBROUTINE strtrim (INOUT str : S)
VARIABLES
i :I;
STATEMENTS
FOR i :=3D 1 TO 80 DO
IF (str(i..i) <> " ") THEN
EXITLOOP;
ENDIF;
ENDFOR;
str :=3D str(i..80);
ENDSUBROUTINE
#define _STRTRIM 1
/opt/fox/ciocfg/sequeninclude/str2int.sub
/***
*
* str2int - Convert a string to an integer
*
* Usage: CALL str2int (str, val, stat)
*
* where
* str : S =3D input string
* val : I =3D integer to receive result
* stat :B =3D TRUE if conversion successful, else
FALSE
*/
#ifndef _STRLEN_FRONT
#include <./strlen_front.sub>
#endif
#ifndef _STRTRIM
#include <./strtrim.sub>
#endif
SUBROUTINE str2int (IN str : S
INOUT val : I
INOUT stat : B)
VARIABLES
len : I;
i :I;
neg :B;
STATEMENTS
stat :=3D FALSE;
neg :=3D FALSE;
val :=3D 0;
CALL strtrim (str);
CALL strlen_front (str, len);
FOR i :=3D 1 TO len DO
IF (str(i..i) =3D "-") THEN
IF (i =3D 1) THEN
neg :=3D TRUE;
ELSE
GOTO done;
ENDIF;
ELSEIF (str(i..i) =3D "0") THEN
;
ELSEIF (str(i..i) =3D "1") THEN
val :=3D (val*10) + 1
ELSEIF (str(i..i) =3D "2") THEN
val :=3D (val*10) + 2
ELSEIF (str(i..i) =3D "3") THEN
val :=3D (val*10) + 3
ELSEIF (str(i..i) =3D "4") THEN
val :=3D (val*10) + 4
ELSEIF (str(i..i) =3D "5") THEN
val :=3D (val*10) + 5
ELSEIF (str(i..i) =3D "6") THEN
val :=3D (val*10) + 6
ELSEIF (str(i..i) =3D "7") THEN
val :=3D (val*10) + 7
ELSEIF (str(i..i) =3D "8") THEN
val :=3D (val*10) + 8
ELSEIF (str(i..i) =3D "9") THEN
val :=3D (val*10) + 9
ELSE
GOTO done;
ENDIF;
ENDFOR;
IF neg THEN
val :=3D -val;
ENDIF;
stat :=3D TRUE;
<<done>>
;
ENDSUBROUTINE
#define _STR2INT 1
/opt/fox/ciocfg/sequeninclude/str2real.sub
/***
*
* str2real - Convert a string to a real
*
* Usage: CALL str2real (str, val, stat)
*
* where
* str : S =3D input string
* val : R =3D real to receive result
* stat :B =3D TRUE if conversion successful, else
FALSE
*/
#ifndef _STRLEN_FRONT
#include <./strlen_front.sub>
#endif
#ifndef _STRTRIM
#include <./strtrim.sub>
#endif
SUBROUTINE str2real (IN str : S
INOUT val : R
INOUT stat : B)
VARIABLES
len : I;
i :I;
neg :B;
f1,f2 :R;
STATEMENTS
stat :=3D FALSE;
neg :=3D FALSE;
f1 :=3D 10;
f2 :=3D 1;
val :=3D 0;
CALL strtrim (str);
CALL strlen_front (str, len);
FOR i :=3D 1 TO len DO
IF (str(i..i) =3D "-") THEN
IF (i =3D 1) THEN
neg :=3D TRUE;
ELSE
GOTO done;
ENDIF;
ELSEIF (str(i..i) =3D ".") THEN
IF f1 =3D 1 THEN
GOTO done;
ELSE
f1 :=3D 1;
ENDIF;
ELSEIF (str(i..i) =3D "0") THEN
;
ELSEIF (str(i..i) =3D "1") THEN
val :=3D (val*f1) + (1*f2);
ELSEIF (str(i..i) =3D "2") THEN
val :=3D (val*f1) + (2*f2);
ELSEIF (str(i..i) =3D "3") THEN
val :=3D (val*f1) + (3*f2);
ELSEIF (str(i..i) =3D "4") THEN
val :=3D (val*f1) + (4*f2);
ELSEIF (str(i..i) =3D "5") THEN
val :=3D (val*f1) + (5*f2);
ELSEIF (str(i..i) =3D "6") THEN
val :=3D (val*f1) + (6*f2);
ELSEIF (str(i..i) =3D "7") THEN
val :=3D (val*f1) + (7*f2);
ELSEIF (str(i..i) =3D "8") THEN
val :=3D (val*f1) + (8*f2);
ELSEIF (str(i..i) =3D "9") THEN
val :=3D (val*f1) + (9*f2);
ELSE
GOTO done;
ENDIF;
IF f1 =3D 1 THEN
f2 :=3D f2 / 10;
ENDIF;
ENDFOR;
IF neg THEN
val :=3D -val;
ENDIF;
stat :=3D TRUE;
<<done>>
;
ENDSUBROUTINE
#define _STR2REAL 1
___________________________________________________________________
This list is neither sponsored nor endorsed by The Foxboro Company.
Use the information obtained here at your own risk. For disclaimer,
see http://www.thecassandraproject.org/disclaimer.html#maillist
list info: http://www.freelists.org/list/foxboro
subscribe: mailto:foxboro-request@xxxxxxxxxxxxx?subject=join
unsubscribe: mailto:foxboro-request@xxxxxxxxxxxxx?subject=leave
Other related posts:
- » [foxboro] Some string routines including string to integer & float conversion