#!/usr/bin/kermit +
#!/opt/local/bin/kermit +

forward BEGIN                           # Jump around text

Author: Stephen Mascola
Translated from Perl to Kermit by Frank da Cruz.
Revision 2.0
Last Modified: Tue Feb 10 14:13:00 2009

Description: From ROLM 9751 9005 LIST LEX capture create 3 CSV files:
  File 1- lists all extensions and their attributes
  File 2- lists all extensions line appearences
  File 3- lists all extension group affiliations

Command-line arguments (required):
  1. Capture filename
  2. Switch name

Most of the variables names from the original Perl script were preserved.
A couple differences from Perl should be noted:

  1. Kermit variable names are not case-sensitive.
  2. Kermit substrings are 1-based.

The original script read the entire capture file into an array and then parsed
from the array.  But since the array was accessed sequentially, it was
superfluous and the Kermit script just reads through the file from beginning
to end, producing the same result, with two differences:

  1. The CSV files have blanks squeezed out.
  2. The ACD and NAME fields are corrected for switches that don't have ACD.

:BEGIN

# Macro definitions...

def USAGE { exit 1 Usage: \%1 }
def FATAL { exit 1 FATAL: \%1 }

def SEEK {
     if not def \%1 .\%1 = 1
     decr \%1
     if \%1 fseek /line \%c +\%1
     fread /line \%c text
     if fail forward DONE
}
# Code...

if != \v(argc) 3 {
    usage "\fbasename(\%0) rolm-capture-file-name switch-name"
}
.rawfile := \fcontents(\%1)
.switchname := \fcontents(\%2)

# Avoid super-verbose error message by prechecking existence and readability
# (C-Kermit versions after 8.0.211 have a setting for this).

if not writeable . fatal "Current directory \v(dir) not writeable"
if not exist \m(rawfile) fatal "\m(rawfile): Not found"
if not readable \m(rawfile) fatal "\m(rawfile): Not readable"

fopen /read \%c \m(rawfile)             # Open the capture file for input
if fail exit 1                          # Just quit on failure

.basename := \freplace(\m(rawfile),.cap,) # Basename for CXV files

fopen /write extenFile \m(basename)_exten.csv # Open the output CSV files...
if fail exit 1
fopen /write extenAppearance \m(basename)_extenAppearance.csv
if fail exit 1
fopen /write extenGroupAffiliation \m(basename)_extenGroupAffiliation.csv
if fail exit 1

# Put column headers as first line of each CSV file

fwrite /line extenFile -
"Exten,Type,COS,Target1,Target2,Target3,Target4,BSYI,BSYE,RNAI,RNAE,DNDI,-
DNDE,Ringdown,ACD,Name,OnEquipment,Switch"
if fail exit 1

fwrite /line extenGroupAffiliation "Exten,GroupType,GroupNumber"
if fail exit 1

fwrite /line extenAppearance "Exten,PhoneType,Pad,LineNumber"
if fail exit 1

fread /line \%c text
if fail exit 1

# Note: Replacing repeated calls to \ftrim() with a final \freplace()
# doesn't change the running time, and the code with \ftrim() is clearer.

while not \f_eof(\%c) {
    if equ "\s(text[4:4])" "EXTN" {
        seek 2                          # Skip 2 lines
        .exten    := \ftrim(\s(text[4:7]))
        .type     := \ftrim(\s(text[12:4]))
        .COS      := \ftrim(\s(text[17:3]))
        .target1  := \ftrim(\s(text[21:8]))
        .target2  := \ftrim(\s(text[30:8]))
        .target3  := \ftrim(\s(text[39:8]))
        .target4  := \ftrim(\s(text[48:8]))
        .bsyi     := \ftrim(\s(text[57:1]))
        .bsye     := \ftrim(\s(text[59:1]))
        .rnai     := \ftrim(\s(text[61:1]))
        .rnae     := \ftrim(\s(text[63:1]))
        .dndi     := \ftrim(\s(text[65:1]))
        .dnde     := \ftrim(\s(text[67:1]))
        .ringdown := \ftrim(\s(text[69:8]))
        seek 3                          # Down 3 lines to NAME record header

        # The NAME line comes out in different formats depending on
        # whether the switch has an ACD module.

        if \findex(ACD,\m(text)) {      # Has ACD
            seek 2
           .acd := \ftrim(\s(text[5:1]))
           .extenname := \"\ftrim(\s(text[8:16]))\"
        } else {                        # No ACD
            seek 2
           .acd = N
           .extenname := \"\ftrim(\s(text[4:16]))\"
        }
        # Above fields are present in every lex; fields below are optional.

        seek 2                          # Check for group memberships.
        .onEquipment = "YES"            # Check if on equipment
        if equ "\s(text[43:9])" "EQUIPMENT" .onEquipment = "NO"
    
        seek
        if equ "\s(text[4:9])" "G R O U P" {
            seek 3
            while equ "\s(text[1:2])" "DS" {
                .grp1Type := \ftrim(\s(text[4:4]))
                if \findex(|\m(grp1Type)|,|COMM|PICK|HUNT|SEC|CTRL|) {
                    .grp1Number := \ftrim(\s(text[9:8]))
                    fwrite /line extenGroupAffiliation \m(exten)\,-
\m(grp1Type)\,\m(grp1Number)
                }
                .grp2Type := \ftrim(\s(text[22:4]))
                if \findex(|\m(grp2Type)|,|COMM|PICK|HUNT|SEC|CTRL|) {
                    .grp2Number := \ftrim(\s(text[27:8]))
                    fwrite /line extenGroupAffiliation \m(exten)\,-
\m(grp2Type)\,\m(grp2Number)
                }
                .grp3Type := \ftrim(\s(text[39:4]))
                if \findex(|\m(grp3Type)|,|COMM|PICK|HUNT|SEC|CTRL|) {
                    .grp3Number := \ftrim(\s(text[44:8]))
                    fwrite /line extenGroupAffiliation \m(exten)\,-
\m(grp3Type)\,\m(grp3Number)
                }
                .grp4Type := \ftrim(\s(text[56:4]))
                if \findex(|\m(grp4Type)|,|COMM|PICK|HUNT|SEC|CTRL|) {
                    .grp4Number := \ftrim(\s(text[61:8]))
                    fwrite /line extenGroupAffiliation \m(exten)\,-
\m(grp4Type)\,\m(grp4Number)
                }
                seek
            }
        } # End while loop for groups

        # Check for line appearences
        if eq "\m(onEquipment)" "YES" {
            while not equ "\s(text[4:15])" "T E R M I N A L" {
                seek
            }
            seek 4
            while equ "\s(text[1:2])" "DS" {
                .phone1Type := \ftrim(\s(text[4:9])) # 1
                if def phone1Type {
                    .pad1 := \ftrim(\s(text[14:9]))
                    .line1No := \ftrim(\s(text[24:2]))
                    fwrite /line extenAppearance \m(exten)\,-
\m(phone1Type)\,\m(pad1)\,\m(line1No)
                }
                .phone2Type := \ftrim(\s(text[29:9])) # 2
                if def phone2Type {
                    .pad2 := \ftrim(\s(text[39:9]))
                    .line2No := \ftrim(\s(text[49:2]))
                    fwrite /line extenAppearance \m(exten)\,-
\m(phone2Type)\,\m(pad2)\,\m(line2No)
                }
                .phone3Type := \ftrim(\s(text[54:9])) # 3
                if def phone3Type {
                    .pad3 := \ftrim(\s(text[64:9]))
                    .line3No := \ftrim(\s(text[74:2]))
                    fwrite /line extenAppearance \m(exten)\,-
\m(phone3Type)\,\m(pad3)\,\m(line3No)
                }
                seek
            } #end while DS                 
        } # End if "YES"
        # Print extension record
        fwrite /line extenFile {\m(exten)\,\m(type)\,-
\m(COS),\m(target1)\,\m(target2)\,\m(target3)\,\m(target4)\,-
\m(bsyi)\,\m(bsye)\,\m(rnai)\,\m(rnae)\,\m(dndi)\,\m(dnde)\,-
\m(ringdown)\,\m(acd)\,\m(extenname)\,\m(onEquipment)\,\m(switchName)}
    }
    # Get next line and loop
    seek 
}
:DONE

fclose \%c                              # Close files
fclose extenFile
fclose extenAppearance
fclose extenGroupAffiliation

exit 0

; Local Variables:
; comment-column:40
; comment-start:"# "
; End:
