############################################################################
#
#	File:     getkeys.icn
#
#	Subject:  Procedures to get keys for a gettext file
#
#	Author:   Richard L. Goerwitz
#
#	Date:     May 2, 2001
#	
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#	Version:  1.2
#
############################################################################
#
#  Getkeys(FNAME) generates all keys in FNAME in order of occurrence.
#  See gettext.icn for a description of the requisite file structure
#  for FNAME.
#
############################################################################
#
#  Requires: UNIX (maybe MS-DOS; untested)
#
############################################################################
#
#  See also: gettext.icn
#
############################################################################
#
#  Links: adjuncts
#
############################################################################

link adjuncts

global _slash, baselen

procedure getkeys(FNAME)

    local line, intext, start_unindexed_part
    initial {
	if /_slash then {
	    if find("UNIX"|"Amiga", &features) then {
		_slash := "/"
		_baselen := 10
	    }
	    else if find("MS-DOS", &features) then {
		_slash := "\\"
		_baselen := 8
	    }
	    else stop("getkeys:  OS not supported")
	}
    }

    /FNAME & stop("error (getkeys):  null argument")

    # Try to open index file (there may not be one).
    if intext := open(Pathname(FNAME) || getidxname(FNAME)) then {
	# If there's an index file, then just suspend all the keys in
	# it (i.e. suspend every line except the first, upto the tab).
	# The first line tells how many bytes in FNAME were indexed.
	# save it, and use it to seek to unindexed portions later on.
	start_unindexed_part := integer(read(intext))
	while line := read(intext) do
	    line ? suspend tab(find("\t")) \ 1
	close(intext)
    }

    intext := open(FNAME) | stop("getkeys:  ",FNAME," not found")
    seek(intext, \start_unindexed_part | 1)
    while line := read(intext) do
	line ? { suspend (="::", tab(0)) \ 1 }

    # Nothing left to suspend, so fail.
    fail

end

