[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:   //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