home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD 45 / SuperCD45.iso / talleres / prog_alternat / StringUtils / stringutils.mod next >
Text File  |  1999-10-31  |  3KB  |  86 lines

  1. MODULE StringUtils;
  2.  
  3. IMPORT In,Out,st := Strings;
  4. TYPE
  5.    STRING50 = ARRAY 50 OF CHAR;
  6.  
  7.    someP* = POINTER TO someR;   
  8.    someR = RECORD                     
  9.      datatype : STRING50;
  10.    END;
  11.    
  12.    intP = POINTER TO intR;
  13.    intR = RECORD(someR)
  14.        i* : INTEGER;
  15.    END;
  16.  
  17.    chP* = POINTER TO chR;
  18.    chR = RECORD(someR);
  19.        c* : CHAR;
  20.    END;
  21.  
  22.    strP* = POINTER TO strR;
  23.    strR = RECORD(someR);
  24.         s* : STRING50;
  25.    END; 
  26.  
  27.   arr10T* = ARRAY 10 OF someP;
  28.   arrT* = ARRAY OF someP;
  29.  
  30.       
  31. PROCEDURE ProcessArray( VAR s : st.StringT; arr : arrT );
  32. VAR
  33.   pos, ActualLen, i, SearchStart : LONGINT;
  34.   msg, ints : STRING50;
  35. BEGIN
  36.  (* Display the total length of the array, arr                                                    *)
  37.  (* This is for testing purposes only                                                             *)
  38.   Out.Ln; 
  39.   Out.String( "Array Length = " );
  40.   Out.Int( LEN(arr), 0 );    
  41.  (* Now find the number, ActualLen, of the array-slots that contain data (i.e. that aren't NIL )  *)
  42.   ActualLen := 0;
  43.   WHILE arr[ActualLen] # NIL DO INC(ActualLen);  END;
  44.   Out.Ln;
  45.   Out.String( "Actual Array Length = " );
  46.   Out.Int( ActualLen, 0 );   
  47.   Out.Ln;
  48.  (* ===== Start of string formatting code ===== *)
  49.   SearchStart := 0;                            (* initially search for % from index 0 in string   *)
  50.  
  51.   FOR i := 0 TO ActualLen-1 DO                 (* FOR each object in the array...                 *)
  52.      pos := st.PosChar('%', s, SearchStart );  (* ...find the pos of the % char...                *)
  53.      IF arr[i] IS chP THEN                     (* IF array item is chP...                         *)
  54.           (*--- some debug output ---*)
  55.           Out.String( "It's a char! - " );
  56.           Out.Char( arr[i](chP)^.c ); (* ^ here is optional *)    
  57.           Out.Ln;  
  58.           (*-------------------------*)
  59.         s[pos-1] := arr[i](chP)^.c;            (* ...insert char, c, at pos of % in string         *)
  60.      ELSIF arr[i] IS intP THEN                 (* ELSE IF array item is intP...                    *) 
  61.           (*--- some debug output ---*)
  62.           Out.String( "It's an integer! - " );
  63.           Out.Int( arr[i](intP)^.i, 2 );  
  64.           Out.Ln;
  65.           (*-------------------------*)
  66.         st.Delete(s, pos, 1);                  (* ...convert i to string and insert it at pos of % *)
  67.         st.Str(arr[i](intP)^.i, ints ); 
  68.         st.Insert(ints, s, pos );
  69.      ELSIF arr[i] IS strP THEN                 (* ELSE IF array item is strP...                    *) 
  70.           (*--- some debug output ---*)
  71.           Out.String( "It's a string! - " );
  72.           Out.String( arr[i](strP)^.s );  
  73.           Out.Ln;                                               
  74.           (*-------------------------*)
  75.         st.Delete(s, pos, 1);                  (* ...insert it at pos of % in the string           *)
  76.         st.Insert(arr[i](strP)^.s, s, pos );        
  77.      ELSE                                      (* ELSE array item is something else, so say so!    *)
  78.         Out.String( "It's summat else!" );  
  79.   END;
  80.      SearchStart := pos + 1;                   (* reset search index when looking for % next time  *) 
  81.   END; (* FOR 0 TO... *) 
  82. END ProcessArray;
  83.  
  84. BEGIN
  85. END StringUtils.
  86.