MODULE ObxCount1;
(**

   project   = "BlackBox"
   organization   = "www.oberon.ch"
   contributors   = "Oberon microsystems"
   version   = "System/Rsrc/About"
   copyright   = "System/Rsrc/About"
   license   = "Docu/BB-License"
   changes   = ""
   issues   = ""

**)

   IMPORT TextMappers, TextControllers, StdLog;

   PROCEDURE Do*;

   (** use TextCmds.SelectionGuard as guard for this command **)
      VAR c: TextControllers.Controller; from, to, ints, reals, strings: INTEGER;
         s: TextMappers.Scanner;
   BEGIN
      c := TextControllers.Focus();
      IF (c # NIL) & c.HasSelection() THEN
         c.GetSelection(from, to);   (* get selection range; from < to *)
         s.ConnectTo(c.text);   (* connect scanner to this text model *)
         s.SetPos(from);   (* set the reader to beginning of selection *)
         s.Scan;            (* read the first symbol of the text selection *)
         ints := 0; reals := 0; strings := 0;   (* counter variables *)
         WHILE s.start < to DO   (* read all symbols starting in the text selection *)
            IF s.type = TextMappers.int THEN   (* symbol is an integer number *)
               INC(ints)
            ELSIF s.type = TextMappers.real THEN   (* symbol is a real number *)
               INC(reals)
            ELSIF s.type = TextMappers.string THEN   (* symbol is a string/identifier *)
               INC(strings)
            END;
            s.Scan      (* read next symbol of the text selection *)
         END;
         StdLog.String("Integers: "); StdLog.Int(ints); StdLog.Ln;
         StdLog.String("Reals: "); StdLog.Int(reals); StdLog.Ln;
         StdLog.String("Strings: "); StdLog.Int(strings); StdLog.Ln;
         StdLog.Ln
      END
   END Do;
END ObxCount1.