From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.5-pre1 (2020-06-20) on ip-172-31-74-118.ec2.internal X-Spam-Level: X-Spam-Status: No, score=-1.9 required=3.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.5-pre1 Date: Fri, 24 Apr 1992 21:24:08 UTC+0100 From: Borja TORON ANTONS Subject: Oh, no! Ada-strings... Message-ID: <182*/S=toron/OU=ccucvx/O=unican/PRMD=iris/ADMD=mensatex/C=es/@MHS> List-Id: Brian, the problem with ADA-strings is that range is too static. Your "empty string" is 0-length, but your variable 'str' is a 100-length string... they're different types for the compiler. The solution is to use 'variable strings' as follows: ================== Package Var_string is type vstring(len: natural:=200) is record str : STRING (1..len); end record; function "&" (s1,s2: in vstring) return vstring; function "&" (s1: in vstring; car : in CHARACTER) return vstring; function find (todo,sub_str: in vstring) return NATURAL; function copy (cadena: in vstring; index, count: in natural) return vstring; procedure delete(cadena: in out vstring; index, count: natural); function convert(s:string) return vstring; function "<" (iz,de: in vstring) return BOOLEAN; function ">" (iz,de: in vstring) return BOOLEAN; end Var_string; ================== -------------------------------------- ================== package body Var_string is function "&" (s1,s2: in vstring) return vstring is begin return (s1.len+s2.len,s1.str&s2.str); end "&"; function "&" (s1: in vstring; car : in CHARACTER) return vstring is begin return (s1.len+1,s1.str&car); end "&"; function find (todo,sub_str : in vstring) return NATURAL is begin for i in 1..todo.len-sub_str.len+1 loop if todo.str(i..i+sub_str.len-1)=sub_str.str then return i; end if; end loop; return 0; end; function copy(cadena: in vstring; index, count: in natural) return vstring i s s:vstring; indice:natural:=index; begin s:=(0,""); while (indice<=cadena.len)and(indice<=(index+count-1)) loop s:=s&cadena.str(indice); indice:=indice+1; end loop; return s; end; procedure delete(cadena: in out vstring; index, count: natural) is final: natural :=index+count; sub1, sub2: vstring; begin sub1:=(index-1, cadena.str(1..index-1)); if final" (iz,de: in vstring) return BOOLEAN is begin return iz.str>de.str; end ">"; function convert(s:string) return vstring is begin return(s'last+1-s'first,s); end; end Var_string; ======================= with this package, if you have: str: vstring; you could do: str:=(0,""); or str:=convert(""); It's a bit longer, but it helps! Borja TORON Just an ADA user...