#!/usr/local/bin/wermit +
;
; From: Dat Thuc Nguyen
; Date: 27 May 1999
; Subject: Incoming Script: Word Frequency
; URL: http://www.smalltickle.com
;
; WORD FREQUENCY COUNTING IS THE EXCEL OF SCRIPTING
; LANGUAGES SUCH AS AWK AND PERL. WITH OOP, C-KERMIT ALSO
; HANDLES THAT TRIVIAL TASK COMFORTABLY.
; THE FOLLOWING SCRIPT DEFINES AND USES THE CLASS WORDS
; TO COUNT THE OCCURRENCES OF UNIQUE WORDS OF A REGULAR
; TEXT FILE.
; THE CLASS WORDS SHIELDS THE IMPLEMENTATION DETAILS AND
; PROMOTES REUSE, THE FLAGSHIP OF OOP.
;
; Invoke with argument 1 = Name of text file.
; If no name is given, it is prompted for.
;
; Requires C-Kermit 7.0 Beta.07 or later.

;**************************************************
;*   DEFINITION OF THE CLASS WORDS                *
;**************************************************
define Words {
; \%1 name of the new Words
     _assign Words::\%1.words \x02
     _define \%1 {
          if define \m(Words::\%1) {
               Words::\%1 \v(macro) {\%2} {\%3} {\%4}
               if FAIL END \v(return)
               return \v(return)
          } else {
               END -9999 doesNotUnderstand
          }
     }
}

;**************************************************
;*   PUBLIC USAGE INTERFACE OF THE CLASS WORDS    *
;**************************************************
define Words::add {
     local \%f
     assign \%f \find(\x02\%2\x02, \m(Words::\%1.words))
     if \%f {
          _increment Words::\%1.count[\%2]
     } else {
          _assign Words::\%1.words \m(Words::\%1.words)\%2\x02
          _assign Words::\%1.count[\%2] 1
     }
}
define Words::frequency {
     local \&a[] \%i
     for \%i 1 \fsplit(\m(Words::\%1.words),&a,\x02) 1 {
          echo \&a[\%i] => \m(Words::\%1.count[\&a[\%i]])
     }
}
define Words::destroy {
     local \&a[] \%i
     for \%i 1 \fsplit(\m(Words::\%1.words),&a,\x02) 1 {
          _define Words::\%1.count[\&a[\%i]]
     }
     _define Words::\%1.words
     _define \%1
}

; AND HERE IS THE WORD FREQUENCY COUNTING SCRIPT word_cnt.ksc

while not defined \%1 {
    ask \%1 { Filename: }
}
open read \%1
if fail exit 1 Can't open \%1

words abc				; create a dictionary abc
local \%l \%i

while true {
    read \%l				; read a line
    if fail break			; until EOF
    if > \flength(\%l) 0 {		; skip empty line
        declare \&a[]			; allocate a dynamic array
        for \%i 1 \fsplit(\%l,&a) 1 {	; split line on nonalphanumeric
            abc add \flower(\&a[\%i])	; add word in lower case to dictionary
        }
    }
}

abc frequency				; display each words and its count
abc destroy				; get rid of the dictionary

exit
