1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <ctype.h>
# STRDIC -- Search a dictionary string for a match with an input string.
# The input string may be an abbreviation of a dictionary entry, however,
# it is an error if the abbreviation is not unique. The entries in the
# dictionary string are separated by a delimiter character which is the first
# character of the dictionary string. The full name of the matched dictionary
# entry found is returned in out_str; the function value is the word index of
# the dictionary entry. The output string may be the same as the input string.
int procedure strdic (in_str, out_str, maxchars, dict)
char in_str[ARB] # Input string, always lower case
char out_str[ARB] # Output string as found in dictionary
int maxchars # Maximum length of output string
char dict[ARB] # Dictionary string
char ch, fch
int start, len, ip, i, match, entry
int strlen(), strncmp()
begin
if (dict[1] == EOS)
return (0)
for (i=1; IS_WHITE (in_str[i]); i=i+1)
;
start = i
match = 0
ip = 2
len = strlen (in_str[start])
fch = in_str[start]
# Search the dictionary string. If the input string matches a
# dictionary entry it is either an exact match (len = dictionary
# entry length) or a legal abbreviation. If an abbreviation
# matches two entries it is ambiguous and an error.
for (entry=1; dict[ip] != EOS; entry=entry+1) {
if (dict[ip] == fch) {
if (strncmp (dict[ip], in_str[start], len) == 0) {
for (i=1; i <= maxchars; i=i+1) {
ch = dict[ip+i-1]
if ((ch == dict[1]) || (ch == EOS))
break
out_str[i] = ch
}
out_str[i] = EOS
if ((dict[ip+len] == dict[1]) || (dict[ip+len] == EOS))
return (entry) # exact match
else {
# If we already have a match and the new match is not
# exact, then the abbreviation is ambiguous.
if (match != 0)
return (0)
else
match = entry
}
}
}
repeat {
ip = ip + 1
} until (dict[ip-1] == dict[1] || dict[ip] == EOS)
}
return (match)
end
|