Xtme is a program for creating and modifying formal
metadata, that is, structured documentation conforming to the
Content Standards for Digital Geospatial Metadata devised
by the Federal Geographic Data Committee (FGDC). This
editor is written using Standard C to run on UNIX systems
with the X Window System, release 11, version 4 or later.
It utilizes the X Toolkit and the Athena widget set, which
are available on nearly all X distributions.

Tkme is an improved version of Xtme, built with Tcl/Tk
instead of direct calls to the X Window System. This enables
Tkme to run on Microsoft Windows as well as Unix systems.

The editors share a considerable amount of source code with
the companion product, mp, a compiler for formal metadata
<http://geology.usgs.gov/tools/metadata/tools/doc/mp.html>
whose purpose is to verify that the syntactical structure of
a file containing formal metadata conforms to the FGDC standard,
and to reexpress the metadata in various useful formats. The
editor is intended to simplify the process of creating metadata
that conform to the standard.

The editors have the ability to recognize and process elements
that are not part of the FGDC standard, provided these elements
are properly described in a local file.

Xtme and Tkme are available in source code. Executable files are
available for Linux, Solaris, and Microsoft Windows as well.

Supplemental_Information:

1. Command line options

xtme is started by issuing a command to the operating system.
Its behavior is controlled primarily through X resources,
which may be specified on the command line but which are
generally stored in an disk file in the user's home directory.

To edit an existing metadata file, give its name on the
command line as an argument.

2. X resources

Standard X resources can be specified to govern the behavior of the
Athena Widgets used by xtme. In addition, the following resources
can be used to affect the behavior of xtme.

configFile

This resource identifies the configuration file used for specifying
input options and local extensions. The default value for this
resource is .mprc, so xtme will look in the current directory for
a file with that name.

helpFile

This resource identifies the file containing text intended to assist
the user in filling in element values, respectively. The default
value for this resource is xtme.hlp, so xtme will look in the
current directory for a file with that name.

keyboardFocusPolicy

By default, it matters where the pointer is when you press keys. If
you like pointer focus in your window manager, you are probably
comfortable moving the mouse around a lot while typing. But if,
like me, you prefer click-to-type windows, then you will want to
change this value to Explicit. Letter case doesn't matter.

Actions for event translations

The following actions are available for use in translation
tables.

save Write the current file to disk
save-as Save the current file under a different name
quit Exit the editor without saving
ok-save Accept the name given in the save-as dialog
cancel-save Cancel the save-as dialog
cut Remove the current node, making it the X selection
copy Copy the current node, making it the X selection
paste Paste metadata from this or another file
clear Remove scalar children in the current subtree
duplicate Create a copy of the current element
help Display guide information for the current element
dismiss Dismiss the guide information window
hide Conceal elements below the current node
show Reveal elements below the current node
collapse Conceal all elements at a given level
expand Reveal all elements at a given level
list-home Move to the root node of the metadata
list-up Move up one element in the list
list-down Move down one element in the list
list-pageup Move up one screen-full in the list
list-pagedown Move down one screen-full in the list

Some of these actions are the same as menu items, while others are
not. There are no menu items that invoke the actions list-home,
list-up, list-down, list-pageup, and list-pagedown. The list-
actions are accomplished using the mouse in the scrollbar of the
list window.

3. Input file format

Since the FGDC Content Standards for Digital Geospatial
Metadata, as the name implies, specifies only the contents of
metadata files and not their encoding, it is necessary to
choose or devise a specification for metadata encoding in
order to create formal metadata. The encoding format interpreted
and produced by this editor is the same as that used by mp.
Interested users are referred to the documentation for mp
for details on this file format.

4. Configuration file format

The configuration file should be laid out exactly as for mp.

5. Local extensions

Local extensions, element names not found in the FGDC standard
and the relationships among them, are described in a text file
laid out exactly as for mp.

6. Help file format

A help file is provided with the editor. It contains brief
descriptions of the standard elements, with the syntactical
structure of compound elements described using the production
rules of the standard. Additional elements can be added to
this file. To add another element, place its name at the
beginning of a line. The text describing the element should be
placed on lines following the element name but in each of these
lines the first character must be a space or tab. Elements
can be added in any order.

7. Output file format

The metadata are output using the same encoding format as input,
but on output the indentation is standardized at two spaces per
level in the hierarchy.

8. Operation

The editor can be invoked with no arguments. In that case,
the metadata will be saved as "Untitled" unless the name is
changed using the Save As option in the File menu. If a file
name is given on the command line, that file will be opened
and its contents will be interpreted as metadata. If the file
does not exist or is empty, a Metadata node will be created
to which the user may add appropriate elements.

The display consists of three parts: a menu bar at the top,
a scrolling list widget containing the structural elements
of the current metadata, and a text widget containing the
contents of the currently selected element.

To add an element to the metadata, select the parent element
in the list widget, then choose the appropriate component
from the Add menu. Note that the Add menu changes to reflect
the components permitted under each element. When a scalar
element (that is, one not composed of other elements) is
selected, the Add menu will urge the user to enter the text
in the text widget. The insertion caret will then be visible
and text can be entered. Note that text can be inserted using
the standard X selection (cut-and-paste) function.

To delete an element of the metadata, select it in the list widget,
and choose Cut from the Edit menu. Note that this removes the
entire subtree (that is, the element, its components, and their
components). The Cut option in the Edit menu makes the subtree
available through the X selection mechanism, and the subtree can
be pasted into another application. At this writing, the paste
operation will convert the subtree to indented text.

The Copy option of the Edit menu also makes the current subtree
available to the X selection mechanism, but does not remove the
subtree from the current tree.

The Clear option of the Edit menu removes the scalar data from
the current element, its components, and their components. This
allows the user to retain the structure of a subtree but replace
the information it contains.

The Paste option of the Edit menu causes xtme to attempt to
insert the subtree most recently cut or copied. The subtree
is inserted as a child of the current element if that is
permitted by the standard. If the first node of the subtree
is not a child of the current element, xtme looks up the
tree towards the root node for an element into which the subtree
can be inserted. If there is no such element, the subtree
is not inserted.

To insert a section of metadata from another file or application,
select it in the other application and invoke the paste action
(by default, pressing the middle mouse button in the list window).
The data are expected to be ASCII, indented using the same rules as
for mp and xtme, so you can select a section of indented text using
a text editor or use Cut or Copy from xtme.

------------------------------------------------------------
I have tried to make the paste menu item operate the same way as
the paste action, but I have been unable to make it work without
crashing. The problem appears to lie with the time value passed
to XtGetSelectionValue; when the paste function is invoked through
an action procedure, the time can be taken from the event that
precipitated the action or from XtLastTimestampProcessed and the
selection value is obtained quickly and correctly. But when the
function is invoked through the menu item's callback procedure, the
time obtained from XtLastTimestampProcessed, while apparently a
legitimate time value, is somehow not correct, because the program
freezes for a while, then dumps core. If you know a lot about Xt
programming and are willing to assist with this problem, please
send email to pschweitzer@usgs.gov.
------------------------------------------------------------

The Duplicate option of the Edit menu causes xtme to create an
empty copy of the current element immediately following the
current element, at the same level in the hierarchy.

The Swap option of the Edit menu moves the element that is
currently selected up in the list of components of its parent.
This allows you to reorder the components of a compound
element.

The View menu allows the user to control the display of elements
in the list widget. Options are as follows:

All levels Make the entire hierarchy visible.
1 level Conceal all elements below the first level.
2 levels Conceal all elements below the second level.
3 levels Conceal all elements below the third level.
Hide Conceal all components of the current element.
Show Reveal all components of the current element.

When an element's components are hidden, a plus sign is shown
at its left side in the list widget.

The Help menu has three options. Each causes text to be displayed
in a popup window. To remove the popup window, choose its Dismiss
button. The text widget is configured to wrap the text by default,
but this can be changed by choosing the Wrap button.

Version displays the version number and date of xtme. Element
displays information specific to the element currently selected
in the list widget. This information is updated every time you
select a different element in the structure. Output displays the
complete metadata record, with textual values in the indented
hierarchical format. Note that the popup shows the metadata as it
was when the Output option was selected and is not updated
automatically. To display later changes, choose Output again from
the Help menu.

To exit the editor without saving changes to the metadata, choose
Quit from the File menu. To save the metadata at any time, choose
Save. To exit the program, saving the changes, choose Close. To
save the metadata under a new name, choose Save As; a popup dialog
permits entry of the new name.

9. Known bugs

When pasting in a subtree from another application, xtme will
crash if a line in a textual value in the pasted subtree begins
with a recognized element and is indented relative to the text
immediately following it.

Throughout the 1980s and early 1990s, the improving capability
of desktop computers to carry out complex analyses has
increased the popularity of geographic information systems
(GIS). As they became familiar with GIS technology, people at
all levels of government, in industry, and in academia have
been calling for better access to publically-available
geospatial information and more general use of standard terms
of reference and of standard formats for the exchange of
geospatial data and information.

Answering this need is the goal of the National Spatial Data
Infrastructure (NSDI), a government-wide coordination effort
initiated at the Federal level through Executive Order 12906,
which was signed by President Clinton in April of 1994.

A key component of NSDI is the development of a National
Geospatial Data Clearinghouse, a general source of information
about geospatial data that are available to the public. With
the Clearinghouse a user can determine whether geospatial data
on a region of interest exist and are appropriate for solving
the problem at hand.

The Clearinghouse is a distributed network of internet sites
providing metadata (information about geospatial data) to
users in approximately the same way. Its success depends on
the overall consistency of the metadata that are made
available, because users are expected to evaluate metadata
from numerous sources in order to determine which data meet
their needs.

To promote consistency in metadata, the Federal Geographic
Data Committee (FGDC), an interagency council charged with
coordinating the Federal implementation of NSDI, has produced
the Content Standards for Digital Geospatial Metadata
(CSDGM). That document provides standard terms describing
elements common to most geospatial data, and encourages people
who document geospatial data sets to use these terms.

The Content Standards for Digital Geospatial Metadata
(hereafter referred to simply as "the standard") describes not
only the terms of reference but also specifies the
relationships among those terms. The relationships, many of
which are hierarchical, are complex and a formal syntax is
provided to specify them.

Because the syntax of the standard is complex and the number
of descriptive elements is fairly large (335), creating
metadata that conform to the standard is not an easy task. In
addition to the problem of assembling the information needed
to properly describe the subject data sets, data producers
must arrange that information using the terms given in the
standard and arrange the terms using the syntactical rules
given in the standard. The resulting metadata are formally
structured and use standard terms of reference, hence the
term "formal metadata" in the title of this report.

This software is designed to simplify the process of creating
formal metadata conforming to the standard. It provides the
element names, maintains the hierarchical structure, and
ensures proper arrangement of elements.

Added paste functions. This doesn't yet work from the
callback (i.e. through the menu), but does work through
the action.

Date: 18-Jan-1996 (process 3 of 110)

Added Duplicate button in Edit menu, with duplicate() action.
this inserts a node following the current node, and gives the
new node the same key.

Date: 19-Jan-1996 (process 4 of 110)

Modified xtme.c to allow completely modeless operation, by creating
a new resource keyboardFocusPolicy. If this resource, which is set
to "Pointer" by default, is set to "Explicit" (case doesn't matter),
then whenever the main window has focus all keyboard input will go
to the value_text widget. With translations for that widget, one
can control the list widget. In the fallback resources, I have
assigned most of the list actions to Meta-KP keys.

Added a dismiss action to allow the help window to be closed using
a keyboard translation. This is by default mapped to Escape.

Fixed bugs in functions add_child, insert_item_after, and
insert_item_before in tree.c; these functions did not properly
set the prev member of the child added. The reason why this
wasn't noticed before is there are few functions that
actually traverse the linked lists backwards. Watch for this
problem in the future.

Date: 24-Jan-1996 (process 5 of 110)

I have tried to make the paste menu item operate the same way as
the paste action, but I have been unable to make it work without
crashing. The problem appears to lie with the time value passed
to XtGetSelectionValue; when the paste function is invoked through
an action procedure, the time can be taken from the event that
precipitated the action or from XtLastTimestampProcessed and the
selection value is obtained quickly and correctly. But when the
function is invoked through the menu item's callback procedure,
the time obtained from XtLastTimestampProcessed, while apparently
a legitimate time value, is somehow not correct, because the
program freezes for a while, then dumps core. If you know a lot
about Xt programming and are willing to assist with this problem,
please send email to pschweitzer@usgs.gov.

Date: 25-Jan-1996 (process 6 of 110)

Altered the makefile to cause the source file about.c to be
created at link time. The file about.c contains the text
that is displayed by selecting the Version option of the Help
menu. In the current makefiles, the text in about.c is
created by combining the file version with information
derived from the UNIX uname function, the date and time,
and the text contained in the file HINTS.

Date: 26-Jan-1996 (process 7 of 110)

Modified xtme.c to update the value of Metadata_Date when the
file is saved, if its contents had changed.

Date: 26-Jan-1996 (process 8 of 110)

Fixed a bug in paste_cb and paste_action. These functions allow
you to paste a subtree previously cut or copied from the current
file. They do this without doing an ICCCM atomic transfer. But
they allowed you to do it twice with the same subtree. That caused
dangling and circular references in the linked lists. The modified
version pastes the subtree and then replaces it with a copy of
itself, so the action can be repeated.

Date: 06-Feb-1996 (process 9 of 110)

Modified add_element and create_add_menu in xtme.c to include an
option to add all of the children of the current element. There
is also an action, add-all(), that is by default bound to Alt-a,
that carries out the same function. This is intended to simplify
the process of populating the metadata.

Date: 13-Feb-1996 (process 10 of 110)

Modified paste_subtree() in xtme.c to, by default, paste the subtree
after the current node (the one highlighted in the list) if the
subtree to be pasted will fit as a sibling of the current node.
Fixed a bug in main() that allowed some children of Metadata to not
point back to the root (if Metadata was not read from the file).
Added an action to check the topology of the tree. This is primarily
for me, but it could help a brave user diagnose future bugs. It
would have helped me find past bugs.

Date: 15-Feb-1996 (process 11 of 110)

Modified config.c to recognize the keyword top_level. This fixes
a bug in which the correct keyword was skip_top_level. This applies
to mp as well.

Date: 30-Apr-1996 (process 12 of 110)

Modified build_list() in xtme.c to extend the line array when
line_count equals line_limit, not just when line_count is greater
than line_limit.

Date: 23-May-1996 (process 13 of 110)

Modified cut_cb() in xtme.c to set changed when a subtree is
detached. Now if you load a file and cut a subtree, the file
is considered to have changed (it did, of course), so Close
causes the changed version to be written to disk. Previously,
if you cut a subtree and immediately exited, the file would
not be updated.

Date: 05-Jul-1996 (process 14 of 110)

Modified main() in xtme.c, mp.c, and cns.c to read more than one
local extensions file. This should enable people to choose more
carefully which extensions will apply to a given input file.

Date: 08-Jul-1996 (process 15 of 110)

Modified main in xtme.c to look for two command-line option
constructs: -c configFile or -h helpFile in addition to the
input file name. The configFile and helpFile specified in
this manner supersede those specified in the normal X resource
declarations, including the command-line option that explicitly
invokes the resource manager.

Modified tree.c to include a function prune() that, given a node of the
tree, deletes all subtrees that contain no data. This function clears
out not only empty scalar elements but all container elements that do
not contain any populated scalar elements. The function is invoked by
an option "Prune" in the Edit menu or as an action invoked from a
keyboard translation.

Date: 03-Mar-1997 (process 18 of 110)

Modified clear_scalars() in tree.c to traverse children backwards.
This was causing a core dump in Linux but, inexplicably, not on
other Unix systems. Also set the changed flag in clear_cb() in xtme.c.

Date: 03-Mar-1997 (process 19 of 110)

Modified xtme.c to use a separate pop-up shell to hold the output
window. This causes the output window to be persistent. Added a
button labeled "Update" to that pop-up, which causes it to update
the output text. Modified the File menu to eliminate the Close
option; save and quit do the same thing. Added a pop-up dialog
when saving file named "Untitled", which is what the name is if
you don't start with a file name. Update the window-manager's
frame title with the new name.

Date: 23-Jul-1997 (process 20 of 110)

Modified xtme to call parse_sgml and write_sgml when reading and
writing a file whose name ends with .sgml or .sgm (in lower, upper,
or mixed case).

Date: 12-Sep-1997 (process 21 of 110)

Added the resource "min" to element_viewport and value_text in both
the fallback resources and Xtme.ad. Default value is 150. This keeps
both widgets from becoming smaller than 150 pixels.

Date: 16-Sep-1997 (process 22 of 110)

Modified clear_cb in xtme.c to call set_text on the current element.
This causes the value_text widget to update when Clear is selected
from the Edit menu. Modified dup_cb in xtme.c to call get_text on
the current element. This saves any text entered immediately prior
to the duplicate action.

Date: 26-Sep-1997 (process 23 of 110)

Modified prune() in tree.c to not delete a blank line in a text
value if it immediately follows a line containing text.

Date: 08-Oct-1997 (process 24 of 110)

Modified add_element() in xtme.c to not crash when no element
is selected and (all of the above) is chosen from the Add menu.

Date: 22-Oct-1997 (process 25 of 110)

Modified xtme.c to support a one-line tips widget below the value
window giving informative assistance on menu items. The tips
database is not yet modifiable by the user, so tips are not given
for extensions.

Date: 26-Oct-1997 (process 26 of 110)

Modified make_add_menu() in xtme.c to cache the XtTranslations so
that they need not be parsed every time we create a new add menu.

Date: 28-Oct-1997 (process 27 of 110)

Modified config.c to recognize a new element "tips" under input.
The argument is a file name containing tips as follows, one per line:
parent_element child_element tip_text
Any line containing unrecognized elements is ignored. Delimiters are
spaces or tabs, and a colon can immediately follow the element names.
To use these files, xtme.c was modified to search for and read all
of the tip files specified, and tips.c was modified to add the functions
needed to add tips. Note that the default tips can be replaced using
this mechanism.

Date: 30-Oct-1997 (process 28 of 110)

Modified fallback resources to not specify xtme, hoping that whatever
the name of the executable this will allow those resources to be found.
Modified tip_action to clear the tip when leaving a menu so as not to
give the appearance that the tip text applies when a menu item is not
highlit. Set keyboardFocusPolicy to explicit by default.

Date: 06-Nov-1997 (process 29 of 110)

Minor bug fix in tip_action() of xtme.c; set current_choice to NULL
when clearing the tip label so that the tip label is refreshed
correctly when the pointer re-enters the menu (if the menu has remained
visible when the pointer left the menu).

Date: 11-Nov-1997 (process 30 of 110)

Modified xtme.c to include a line-number indicator for the output
window. The indicator is an editable text widget. The label for
this field is itself a command widget whose action is to go to the
line number specified in the indicator widget.

Date: 14-Nov-1997 (process 31 of 110)

Modified fallback resources for value_text to include <Key>Home and
<Key>End so they go to beginning of line and end of line, respectively.

Date: 24-Nov-1997 (process 32 of 110)

Modified resources so that asciiText widget translations are given
with '.' rather than '*'. This seems to fix the problem in which
xtme crashed when you put the cursor into the scroll bar and typed
PgDn (or XK_Next).

Date: 16-Jan-1998 (process 33 of 110)

Modified check_scalar_children() in check.c to consult element_list_of()
in actions.c to determine whether an element is a scalar rather than
its own list of scalars because the list of scalars it keeps doesn't
include extensions.

Date: 17-Feb-1998 (process 34 of 110)

Modified build_element_list() in xtme.c to free memory used by the lists.
This should actually re-use memory instead, but at least now it won't
leak.

Date: 25-Feb-1998 (process 35 of 110)

Modified fallback resources to bind the event Meta<Key>Delete to
the two actions select-all() and delete-selection(), which come
from the Athena text widget. This causes the keystroke Alt-Del
to delete the entire text in the value window in one stroke.

Date: 18-Mar-1998 (process 36 of 110)

Modified main() in xtme.c to correctly identify the class name of the
application in the call to XtVaAppInitialize. The previous value was
"Geomet", which is the application whose code I originally used to
build xtme in the first place. Thanks to Curtis Price for discovering
the problem of which this fix is (hopefully) the solution.

Date: 26-Aug-1998 (process 37 of 110)

Modified actions.c to describe CSDGM version 2. Set version of xtme to 2.0.

Date: 02-Sep-1998 (process 38 of 110)

Modified xtme.c and tkme.c to expect about_text to be an array of
pointers to strings rather than a single long string. This was done
because Microsoft Visual C++ doesn't allow static strings to be longer
than 2048 bytes. Modified makehelp.c to create a reasonable "About"
text for tkme.

Date: 29-Sep-1998 (process 39 of 110)

Modified tkme.c to write the metadata out in sgml if the output file
name ends with .sgml or .sgm, or in xml if the output file name ends
with .xml (these extensions are not case sensitive, so .XML or .Sgml
would be equivalent to .xml and .sgml respectively).

Date: 19-Oct-1998 (process 40 of 110)

Modified build process for tkme to use mktclapp rather than et2c.

Date: 20-Oct-1998 (process 41 of 110)

Modified tkme to use Cygwin32 development kit under Windows NT and 95
rather than Visual C++.

Date: 24-Nov-1998 (process 42 of 110)

Modified tkme.c and tkmerc.tcl to fix strange bug in edit_paste action.
Thanks to Dave Hart for pointing this out.

Date: Dec-1998 (process 43 of 110)

Modified text.c so that when encode_text is called, it creates a list
of pointers to elements in the tree, in sync with the lines in the
encoded text. Added a function item_of() to return the pointer to
the item given the item's line number in the encoded text. Modified
the output buttons to simplify their appearance, specifically grouping
the Dismiss, Update, and Wrap buttons into a menu with the title View,
adding a separate button "Edit", and changing the label of the goto_line
button to simply "Line:". The callback associated with the Edit button
is jumpto_cb in xtme.c, with a corresponding action jumpto_action
"jump-to()" that could be used in a translation. Changed the translation
for <Btn1Down> in output_text to include line-number(). The effect of
these changes is that when you move the insertion point in the output_text
widget and click Edit, the element you're on becomes the current element
in the edit window, even if it was previously hidden.

Date: 16-Dec-1998 (process 44 of 110)

Modified xtme.c to make the file name the label of the output window's
popup shell.

Date: 18-Dec-1998 (process 45 of 110)

Modified xtme.c to include a Search menu option in the View menu of the
output window; all this does is call the output_text widget's search()
action, specifying the forward direction.

Date: 30-Mar-1999 (process 46 of 110)

Modified tkmerc.tcl to disable the output window's text under Windows.
This works okay because you still get a cursor when the window has
focus. Under Unix it doesn't because although the widget knows what
line you last clicked on, it doesn't produce a visible cursor. Maybe
there's a way to do this with a tag, but I don't know how to do that
yet.

Modified tkme.c to skip over the leading + in the string passed to
the add_menu_items command. This bug caused Tkme to regard as unknown
any element whose children were hidden.

Date: 07-May-1999 (process 47 of 110)

Modified xtme.c and tkmerc.tcl to add a menu item in the View menu
that toggles word wrap in the value widget. I notice that in Xtme
when you type a word that gets wrapped onto the next line, any parts
of that word are still displayed on the current line even though
they aren't really there. This is probably a minor bug in Xaw. When
you go to another element and return, you see the text rendered
correctly in the widget. Word wrap is off by default.

Date: 10-May-1999 (process 48 of 110)

Modified parse_string() in text.c to skip over newlines at the
beginning of the text to be parsed. When present, these newlines
were causing Xtme to see pasted text as scalar even if it really
consisted of one or more blanks followed by a valid subtree. The
net effect is that now if you inadvertently get some blank lines
at the beginning of a subtree that you're going to paste into
Xtme or Tkme, it'll ignore those blank lines.

Date: 02-Jul-1999 (process 49 of 110)

Modified output_update{} in tkmerc.tcl to change the text widget's
state to normal before attempting to update it (Windows version).
Otherwise the update fails. (2.3.6)

Date: 23-Jul-1999 (process 50 of 110)

Modified get_selection_cb() in xtme.c and paste_subtree_cmd() in tkme.c
to call parse_xml_string() (in xml.c) when the string to be pasted into
the application begins with "<?". This could allow applications that
produce metadata fragments in XML to paste into Xtme and Tkme.
(xtme 2.3.5) (tkme 2.3.7)

Date: 26-Jul-1999 (process 51 of 110)

Modified the previous change so that parse_xml_string() is called
when the first character of the selection is '<', rather than when
the first two characters are "<?". This makes it so that you can
get either an XML fragment with an XML declaration or one without
an XML declaration.

Date: 29-Jul-1999 (process 52 of 110)

Modified many of the callbacks in xtme.c to call get_text(current)
before doing their action. This saves changes made to the current
text value, if any. In particular this affects menu items such as
prune, duplicate, and swap, and those under the View menu. Thanks
to Hugh Phillips for pointing out this behavior in Tkme; turns out
that xtme did it wrong also. (2.3.6)

Date: 29-Jul-1999 (process 53 of 110)

Modified tkmerc.tcl to save the text of each element before changing
the element lists, not in set_current{}. Modified tkme.c to better
handle the situation where the user wants to jump to an element using
the Edit button of the output window but has already edited the value
of that element. Problem was that when the element's value got
replaced, the item pointers in the list consulted by item_of() would
become invalid unless the user selected Update from the View menu.
I made it search up the list (towards the top element) for a line in
which item_of() returns a valid node pointer. Turns out for normal
editing this is just fine for small changes. (tkme 2.3.8)

Date: 16-Aug-1999 (process 54 of 110)

Modified tkmerc.tcl to call the C function get_text only within a
new procedure named save_current{}. Added save_current{} to the
list of commands bound to the listbox. That was a bug in which an
edited value wasn't remembered if you moved to another element by
clicking the element with the mouse. This bug was introduced by
the most recent revision, which correctly moved the save function
out of set_current{}. Thanks to Hugh Phillips for pointing this
problem out. (tkme 2.3.9)

Date: 24-Aug-1999 (process 55 of 110)

Added an action to xtme and tkme that inserts the current date in
the value text as YYYYMMDD. This action is bound to Alt-t under
UNIX and Ctrl-t under MS-Windows. (xtme 2.3.7) (tkme 2.3.10)

Date: 24-Aug-1999 (process 56 of 110)

Modified tkmerc.tcl so that it provides a sub-menu cascading from
the Recent option of the File menu. That sub-menu contains the
contents of the file ~/tkme.rc (for UNIX) or /usgs/tools/tkme.rc
(for MS-Windows). Whenever you open a file, if it isn't in this
list, its full path gets put into the list, so the next time you
open tkme, you can simply pick it from the list. The list can have
at most 10 items in it. This could be increased easily but I suspect
that 10 is enough for most people, and more will clutter the user
interface. Thanks to Hugh Phillips for suggesting this. (tkme 2.3.10)

Date: 30-Aug-1999 (process 57 of 110)

Modified swap_cmd() in tkme.c to generate an empty result and return
TCL_OK if swap is called when the first child is selected (and hence
there is nothing to swap with). Previously this returned a harmless
but superfluous error without a message. (tkme 2.3.11)

Date: 02-Sep-1999 (process 58 of 110)

Modified file_open{} in tkmerc.tcl to allow user to filter the file
display based on types. Default display is "Metadata files" with
extension ".met". Additional extensions specified in the config file
elements input:ext are also included as metadata file identifiers.
Other built-in choices are "Text files" with extension .txt or .text,
"XML files" with extension .xml, "SGML files" with extensions .sgml or
.sgm, and "All files", which includes everything. To support this
feature, a C function ext_list_cmd was added to tkme.c that could be
called by Tcl as [ext_list]. It returns a string containing all of
the extensions specified in input:ext config elements. (tkme 2.3.12)

Date: 24-Nov-1999 (process 59 of 110)

Modified xtme.c to not assign out to stderr in the declaration of out,
since stderr is sometimes not a constant. Instead out is assigned to
NULL in its definition statement, and as the first executable statement
of main() out is assigned to stderr. (xtme 2.3.8)

Date: 10-Dec-1999 (process 60 of 110)

Modified tkmerc.tcl to move the search facility from a separate
toplevel and put it into the output window's menu bar. Also
changed output_search{} so that the output text widget takes
focus when that procedure is invoked (by pressing the "Find"
button on the menu bar of the output window). (tkme 2.3.14)

Date: 28-Jan-2000 (process 61 of 110)

Significant changes to memory management for all programs, including
xtme and tkme. See mp documentation for details. Also fixed bug in
tkmerc.tcl that caused "No Wrap" to replace "Dismiss" in the View
menu of the Output window if you selected the "Wrap" option.
(xtme 2.4) (tkme 2.4)

Date: 22-Feb-2000 (process 62 of 110)

Modified xtme.c to fix bug in which a segmentation fault occurred
after the metadata had been saved to disk and before exiting, but
only if no metadata were read on startup, a rare circumstance.
(xtme 2.4.3)

Date: 17-Apr-2000 (process 63 of 110)

Modified the code in read_metadata{} in tkmerc.tcl so that the catch
encloses only the attempt to open the file containing the list of
recently-opened metadata records. This change should make Tkme not
complain when the tkme.rc file is not present. (tkme 2.4.2)

Date: 04-May-2000 (process 64 of 110)

Modified tkmerc.tcl to use the pane manager code found in Brent Welch's
book "Practical Programming in Tcl and Tk, 3rd edition" in chapter 25.
This allows users to adjust the division between the element list window
and the element value window using a grip. (tkme 2.4.3)

Date: 10-May-2000 (process 65 of 110)

Modified tkmerc.tcl to divide the panes horizontally rather than
vertically. Also made the width of the scrollbars 10 instead of
the default 15, the position of the grip at 0.9 of the height of
the frame rather than 0.8, and increased the size of the grip to
15 from the default of 10. (tkme 2.4.4)

Date: 07-Jul-2000 (process 66 of 110)

Fixed a bug in the xml parser pointed out by Frank Roberts that
caused incoming &amp; to be ignored. (xtme 2.4.3) (tkme 2.4.4)

Modified tkmerc.tcl to include an experimental menu option HardWrap,
which causes the current element's text to be reformatted so that it
will fit inside an 80-character line, including the space needed for
2-space indents. This feature is likely to be refined somewhat after
testing. (tkme 2.4.6)

Date: 04-Aug-2000 (process 69 of 110)

Added limited support for foreign languages. This is implemented in
mp, cns, xtme, and tkme through a command-line option -l <code> where
the code is "es" for Spanish and "id" for Indonesian. Preferred
language can also be specified in the config file using

input
language es

Replace es with id for Indonesian; en would be for English, but if
the value is unrecognized or missing the software will use English
element names. (xtme 2.5) (tkme 2.5)

Date: 31-Aug-2000 (process 70 of 110)

Implemented snippets interface in Tkme. Snippets are short
sections of metadata that you want to save for later reuse.
They're stored as plain text files in a subdirectory called
"snippets" within the same directory where your tkme.rc file
resides.

At startup, all of the files in the snippets subdirectory appear
on the menu named "Snippets". When chosen from this menu, the
snippet is read, parsed, and inserted at the current node as
though it were pasted from another Tkme window.

To store the current node as a snippet, choose "Save as snippet"
from the Snippets menu. A standard save-file dialog is shown.
Give the snippet a name; it will be the name of the file in
which the snippet is stored. Don't choose a different directory;
snippets can only be retrieved from the "snippets" directory.

To get rid of a snippet that you don't want, simply delete the
file in which it is stored. (tkme 2.6.0)

Date: 01-Sep-2000 (process 71 of 110)

Modified snippets interface so that subdirectories of the
snippets directory appear on the Snippets menu as cascades,
which means they expand to show the snippets they contain.

Subdirectories of the snippets directory can be created
directly through the underlying operating system. Depending
on the OS, you might be able to create a subdirectory from
within the save-file dialog when you're deciding where to
store the snippet. In this case the snippet will appear
inside a cascaded submenu named for the subdirectory that you
have created. (tkme 2.6.1)

Date: 18-Sep-2000 (process 72 of 110)

Modified tkme.c to insert new elements (from the Add
menu) in the proper order. Since Tkme doesn't enforce
element ordering anyway, it's possible to rearrange
the elements and get results that you might not have
expected in some unusual circumstances. Tkme tries
first to put a new element immediately after the last
element of the same type within the subtree. If there
is no element of that type already present, it puts
the new element before the first element that appears
later in the Standard than the one you're adding.
Extensions always occur after standard elements.
(tkme 2.6.2)

Date: 18-Sep-2000 (process 73 of 110)

Modified tkmerc.tcl so that, under UNIX, the snippets
directory and the list of recently-opened files are
stored in a subdirectory .tkme of the user's home
directory. Further, the name of the list of files
most recently opened is now called recent_files
instead of tkme.rc. (tkme 2.6.2)

Date: 25-Sep-2000 (process 74 of 110)

Modified set_current{} in tkmerc.tcl so that if the list
has no elements, the procedure simply returns without
doing anything. This avoids a crash that occurred when
someone clicked the list window before adding any elements.
Thanks to Hugh Phillips for pointing this out. (tkme 2.6.3)

Date: 25-Sep-2000 (process 75 of 110)

Modified local.c to output more informative messages when
a problem is encountered in building the extensions list.
Since this does not affect the program's normal operation,
I'm not changing its version number. Applies to mp, cns,
xtme, and tkme.

Date: 28-Sep-2000 (process 76 of 110)

Modified element_add_cmd() in tkme.c so that whenever an
element is added, any hidden siblings of the new element
become visible. This bothered me because I saw that you
might add a child of an element whose other children were
not visible; the display was thus a little misleading:

+ Process_Step
Process_Date

In this example, the plus sign indicates that this
particular Process_Step element has some children that
are currently hidden, and the new Process_Date element
that we just added is only one of them. By forcing the
hidden siblings to be exposed, the user can immediately
see the context in which the new element has been added.
(tkme 2.6.4)

Date: 28-Sep-2000 (process 77 of 110)

In tkmerc.tcl, created new procedure view_toggle{} that hides
the current element's children if they are visible and shows
them if they are hidden. This procedure is now bound to a
double-click of button 1 in the list widget. (tkme 2.6.4)

Date: 28-Sep-2000 (process 78 of 110)

Modified tkmerc.tcl to configure the listbox with
exportselection false. This causes the highlighting
of the current element in that widget to not disappear
when you select text in the value window. (tkme 2.6.4)

Date: 06-Oct-2000 (process 79 of 110)

Added direct support for the Biological Data Profile
(FGDC-STD-001.1-1999) to all programs. This involved
modifications to keyword.h, keyword.c, actions.c,
config.c, syntax.c, mp.c, tkme.c, cns.c, and xtme.c.

Activate support for this profile by specifying
"profile bio" under "input" in the config file.
(mp 2.7.0)

Date: 10-Oct-2000 (process 80 of 110)

When I included the bio profile elements, I made it impossible
to use the same elements as extensions even when the bio
profile was not being used. This is because the bio profile
elements are kept by mp in the same bucket that it uses for
standard elements, and you can't use an extension that has the
same name as a standard element. Some of my geological data
sets use the geologic age extensions, which are taken from the
bio profile, but they don't use the rest of the bio profile.
One solution would be to simply use the bio profile for
these records. In this case the geologic age elements are
recognized properly, but a spurious error message is generated
because the bio profile includes one mandatory element,
Description_of_Geographic_Extent within Spatial_Domain.
The missing element is flagged as an error.

The correct solution is for mp and friends not to know the
bio profile elements unless the bio profile is used by
choice. That way the same elements can be introduced as
extensions in the usual way. So I modified keyword.c
and made some changes to the main programs as well, to
introduce a function use_element_names (language,profile).
This function selects standard element names using the
requested language, and adds to them the profile element
names (any profile you want, as long as it's the bio
profile). (mp 2.7.1) (mq 2.5.1) (cns 2.6.1) (tkme 2.7.1)
(xtme 2.6.1)

Date: 12-Oct-2000 (process 81 of 110)

You're editing your metadata record and have made some
substantial changes to the text of some elements. You
haven't saved your work, and you begin changing the
value of another. By a slip of the fingers or mouse,
you manage to mix it up so badly you want to get the
previous value of this element back the way it was when
you started editing it. But there's no way to do this;
if you quit without saving, you've lost the changes that
you made to the other elements, and if you save the
current version, you've lost the previous value of the
element that you're on now.

One solution is to choose Save As from the File menu,
save the current record under a new name, edit both
records, cut the old value from the old version of the
file, and paste it into the new version of the file.

Another solution is the Revert choice of the value
widget's context menu, which pops up if you hold down
the Right mouse button when the pointer is inside the
value widget.

The Revert choice causes the current value's text to be
replaced by whatever it was when you began editing it.
If you move to another element and return, the value of
the current element is saved, and it is that newly-saved
value that will be restored if you choose Revert. So
it doesn't restore the original text of the element,
just the most recently-stored value. (tkme 2.7.1)

Date: 16-Oct-2000 (process 82 of 110)

Many changes to Tkme's code in tkmerc.tcl and tkme.c.

Context menus are now available in the list window,
the value window, and the help text window. Popping
up when the Right mouse button is pressed, these
typically allow a window-specific Cut, Copy, and Paste,
and in the value window include Revert, Wrap, and HardWrap.
Tips have been enabled for all of these choices.

The File menu now includes a Close choice. This saves
the current file and clears the list and value windows,
readying the program to open another record.

It is now possible to use the snippets interface to
insert a metadata template (that is, a snippet can
have as its root the element Metadata). This works
only if you haven't read any metadata yet, since you
can't pin Metadata anywhere within Metadata.

Bindings have been cleaned up significantly, so that
Ctrl-X, Ctrl-C, and Ctrl-V should cut, copy, and paste
(respectively) in a logical way wherever you are.

The text cursor in the value window is now thicker and
colored dark red, so as to stand out more clearly.

Thanks to Doug Dale-Johnson (Saskatchewan Environment)
for helping to identify these needs and test the solutions.
(tkme 2.8.0)

Date: 23-Oct-2000 (process 83 of 110)

Modified the code in tkmerc.tcl handling the list of most-
recently-opened files.

Modified tkme.c so that it explicitly sets the Tcl variable
"changed" when the structure is changed. Modified get_text_cmd()
in tkme.c so that it does not set this variable but instead
returns 1 if the value was changed and zero otherwise. These
changes seem to fix the problem that Tkme was prompting the
user to save the file even immediately after saving the file
through the File:Save menu options.

Added a menu option "Replace" under Edit. This brings up a
dialog box allowing you to replace all occurrences of a search
text string. You can choose to do this (a) only in the current
data element (if the current element is a data element); (b) in
all elements below the current element; or (c) throughout the
whole file. A check-button allows you to require the letter
cases to match; by default the search string will be replaced
even if it is capitalized differently in the text.
(tkme 2.8.1)

Date: 15-Dec-2000 (process 84 of 110)

Modified tkmerc.tcl so that you get a prompt if you select
File:Close and the file has been modified.

Modified tkmerc.tcl so that when you open a file, its name
gets added to the menu under File:Recent immediately, so
that if you close it, you can easily reopen it.

Thanks to Hugh Phillips for pointing these problems out.
tkme 2.8.3

Date: 18-Dec-2000 (process 85 of 110)

Modified read_metadata{} in tkmerc.tcl so that the absolute
path to a file is always used. Also fixed same proc so that
the currently-opened file is added to the recent-files menu
(fixes incorrect implementation in 2.8.3). (tkme 2.8.4)

Date: 02-Jan-2001 (process 86 of 110)

Modified tkmerc.tcl so that when the recent-files list is
read or updated (once at startup, and again every time a
file is opened), if any of the files named in it does not
exist, that file is not included in the menu File:Recent.
When the recent-files list is updated, any file that does
not exist will be omitted from the list. Thanks to Hugh
Phillips for suggesting this improvement. (tkme 2.8.5)

Date: 03-Jan-2001 (process 87 of 110)

Hugh noted: "When you close a file in tkme, the window retains
the name of the file you just closed - it should go to 'unnamed'
or something." I've modified tkmerc.tcl so that the main
window's title bar text is "Tkme: (file name)" when a file is
loaded, and "Tkme: (no file loaded)" if you close a file. When
you open another file, the window title is updated to reflect
the new title. (tkme 2.8.5)

Date: 10-Jan-2001 (process 88 of 110)

Modified file_save{} and file_save_as{} in tkmerc.tcl so that they
properly handle situations in which you cannot write the file
because its permissions, or that of its directory, do not allow
you to do so. The local function can_write{} helps to do this.
Thanks to Doug Dale-Johnson for pointing this problem out.
(tkme 2.8.6)

Date: 06-Mar-2001 (process 89 of 110)

Modified element_add_cmd() in tkme.c so that elements are
inserted in correct order when a blank is present at the
head of the list of children. Previously if you wanted to
add a child using the Add menu and the first sibling was
blank, the new child would not be placed properly.

Modified paste_subtree() in tkme.c so that the same general
rules are followed when pasting subtrees either using the
Edit:Paste mechanism (main menu, popup context menu, or
Ctrl-V keystroke) or the snippet insert menu option.
(tkme 2.8.7)

Date: 08-Mar-2001 (process 90 of 110)

Modified bindings in tkmerc.tcl to simplify and make them
more uniform across platforms. Now Alt-keys affect the
structure and Ctrl-keys affect the value and general
program operation. Also made it so that when text is
selected in the value widget and a paste is performed,
the selection is deleted before the paste. This affects
Windows and not Unix because under X the widget loses
its selection when another application makes a selection.
(tkme 2.8.8)

Date: 13-Mar-2001 (process 91 of 110)

Modified tkmerc.tcl encapsulating in a separate procedure the
code that writes a new file name into the recent-files list
and creates an item for the file in the menu if it is not
already there. Previously this was part of file_open{}, but
as Doug Dale-Johnson kindly pointed out, this operation
should also occur when a file is saved using a new name.

Date: 16-May-2001 (process 92 of 110)

Modified tkmerc.tcl to put a disabled command button
at the top of the context menus for the element structure
and value windows. This serves as a label for the menu.
However it's really there because I found that if I just
quickly pushed the right mouse button and released it,
the first menu item was activated. In each of these menus
the first item is "Cut"; so I felt it was too easy for a
naive user to unwittingly remove the selected element or
text through a single, furtive click of the mouse. Now
the menu's title is the first choice, and it takes no
action. (tkme 2.8.9)

Date: 25-May-2001 (process 93 of 110)

Modified write_xml_item() in xml.c to examine the static
variable element_order when writing the children of an
element. element_order is an enum that can be either
STANDARD or ASIS (in future there could be others).
If its value is STANDARD, then the elements are written
in the order given in FGDC-STD-001-1998 and extensions
are written after all standard elements. This is and
has been the default behavior. If the value is ASIS,
then elements are written in the order they appear in
the parse tree (as input in mp, as modified by Tkme).

Modified config.c to recognize the element "order"
which will be used when found under output:xml.

The effect of this change is to allow people to explicitly
request that mp and Tkme NOT rearrange the elements in the
order given in the FGDC standard. Since most profiles
have not put extensions after all standard elements,
using the standard order causes the extensions to be
put out of the order expected in the profile. This
change allows mp and Tkme to retain the input order.
(mp 2.7.11) (tkme 2.8.10) (xtme 2.6.3) (mq 2.5.7)

Date: 21-Aug-2001 (process 94 of 110)

A strange and unusual situation caused Tkme to crash. If an XML
file contains mixed content in one of the elements, this violates
the data model we're working with and cannot be rectified
automatically. Instead, when the file is read, we return an error
message and discard the data as though it had not been read. This
occurred when an XML file contained the elements:

Note that here element placekt contains both the text of the
thesaurus name and the placekey elements which are terms from that
thesaurus. This is somewhat analogous to the situation in a text
file where an element name appears at the beginning of a line in
a data value. But in that situation it is mp's parser that has
misinterpreted the data, not invalid structure per se. Consequently
it can be repaired automatically. But in the case shown above
the fault lies in the generator of the XML code, and it cannot
reliably be repaired. (tkme 2.8.13) (xtme 2.6.6)

Date: 01-Nov-2001 (process 95 of 110)

Modified view_wrap{} in tkmerc.tcl so that it changes the right
entry in the popup context menu for the value widget. Previously
when you selected Wrap, this code changed the Revert entry to read
No Wrap, but Revert was still the function of that menu entry.
(tkme 2.8.14)

Date: 02-Jan-2002 (process 96 of 110)

Modified add_element{} in tkmerc.tcl so that if the element
that is added is the root element, then the Open, Configure,
and Recent choices of the File menu are disabled. Thanks
to Archie Warnock for pointing out that prior to this, you
could create some metadata using the Add menu and then read
some existing metadata using the Open or Recent choices,
which appended the opened record onto the metadata that you
had just created with the Add menu, not generally what we
want to happen. (tkme 2.8.15)

Date: 11-Oct-2002 (process 97 of 110)

Modified tkmerc.tcl adding save_geometry{} procedure to write the
window positions and sizes to a file geometry.tcl in the same
directory as the recent files list. This file is run by source
when the program is started, restoring the size and positions of
the windows that were visible when the program was last stopped.
By default the help window is deiconified but the output window
is not (otherwise the output window will be blank). Thanks to
Nina Savar for prompting this development. (tkme 2.8.20)

Date: 21-Feb-2003 (process 98 of 110)

Modified save_geometry{} in tkmerc.tcl to also save the
characteristics of the fonts used, so these will be
persistent from session to session. Thanks to Mark
Mihalasky for suggesting this improvement. (tkme 2.8.21)

Date: 19-Mar-2003 (process 99 of 110)

Using a specialized Tcl script, I converted the extension
definitions from the three formal profiles (bio, shoreline,
remote-sensing) to a format compatible with Tkme's help file.
This required a minor change in help.c as well. Now you can
get help on elements from these profiles. (tkme 2.9.1)

Date: 02-Apr-2003 (process 100 of 110)

Modified local.h to correct for number of compound elements
possible in the extensions. Modified tkme.c to put a cast
in the Tcl_CreateCommand function calls to avoid a warning
(because I don't declare the functions with const keyword
for argv). Thanks to Neil Deeds (INTERA Inc) for triggering
my investigation of the problem in local.h.

Date: 23-Sep-2003 (process 101 of 110)

Modified extension-handling and XML parsing code to allow
unrecognized elements in XML to be manipulated by Tkme and
Xtme. (tkme 2.9.3) (xtme 2.7.2)

Date: 16-Jan-2004 (process 102 of 110)

Modified set_text_cmd() in tkme.c so that it recognizes as
compound an unknown extension whose children are not plain
text (previously the element was recognized as compound only
by its having a known element list defined in actions.c).
(tkme 2.9.4)

Date: 14-Feb-2004 (process 103 of 110)

Modified the error output of both local.c and config.c to send the
errors and warnings to a buffer rather than to the FILE *out used
as a global variable. Added two functions, config_errors() and
ext_errors() each of which returns one of the buffer addresses.
The calling program determines if and when the errors from parsing
the config file and extension files are to be shown to the user.
Modified tkme.c to add Tcl functions carrying these two C functions
into the Tcl namespace. Modifed Tkme to create a messages window
if either the config file or any of the extension files generated
errors or warning messages. These are shown to the user at the
beginning of the session. (tkme 2.9.7)

Date: 24-Feb-2004 (process 104 of 110)

Modified tkme.c to read the help file after processing the
config file and setting the language for the element names.
With this arrangement, sections in the help file that are
written with foreign-language element names or extensions
will be recognized correctly and help can be displayed for
them. xtme already did this correctly. (tkme 2.9.8)

Date: 07-Jul-2004 (process 105 of 110)

Modified tkmerc.tcl to add items to the context menu for the structure
window. Duplicate, Clear, Prune, and Save as snippet are now shown on
that context menu, with a separator between them and the basic three
(Cut, Copy, Paste). Modified tkme.c to add tip text for those new
context menu items. (tkme 2.9.10)

Date: 07-Feb-2005 (process 106 of 110)

Modified parse_xml() in xml.c to reinitialize the root and current
node pointers every time this procedure is called; these are static
pointers local to the xml.c module which need to be cleared when
the Tkme user closes a file in order to open another one,
otherwise the XML parser is trying to build a parse tree on top
of the previous tree, which has already been deallocated. Thanks
to Peter Neri (Teleatlas) for noticeing the problem. (tkme 2.9.16)

Date: 02-Mar-2006 (process 107 of 110)

Modified help mechanism to automatically load the correct help
file based on the specified language. Create German and French
versions of the help file from the respective Standard
translations. (tkme 2.9.19)

Date: 02-Oct-2006 (process 108 of 110)

Modified decode_help() in help.c so that it fails gently if NULL or
an empty string was passed as its argument. (tkme 2.9.21) (xtme 2.7.16)

Date: 06-Nov-2009 (process 109 of 110)

Modified tkmerc.tcl, keyword.c, and tkme.c to expand the Configure
option of the File menu. It is now a cascading menu that allows
the user to choose a profile, language, or read a separate config
file. This means you won't need to create a config file just to
use a profile or a language other than English. (Tkme 2.9.25)

Date: 14-Dec-2009 (process 110 of 110)

Modified tkmeint.c, tkme.c, tkmerc.tcl, and tkme.tcl (latter from
the tkme.vfs) so that snippets, on Microsoft Windows, will be
stored in the user's application directory.

Modified tkme.tcl so that, on Microsoft Windows, a menu item in
the Snippets menu will open up the snippets folder. This allows
you to copy snippets directly into the folder; when Tkme is next
restarted, it will discover those snippets and make them available
for use. (tkme 2.9.26)

The compiler embodies the syntax of the 1998 version of
the Content Standard for Digital Geospatial Metadata, known as
FGDC-STD-001-1998 and also supports the Biological Data Profile
of that standard, FGDC-STD-001.1-1999.

Local extensions to the standard are permitted and a mechanism
is provided that allows these extensions to be described to
the compiler.

Source code and make description files are included. Where
discrepancies exist between the syntactical and semantic
descriptions of elements in the Content Standards for Digital
Geospatial Metadata, the syntactical descriptions are regarded
as authoritative.

Although this program has been used by the USGS, no warranty, expressed or
implied, is made by the USGS or the United States Government as to the
accuracy and functioning of the program and related program material nor shall
the fact of distribution constitute any such warranty, and no responsibility
is assumed by the USGS in connection therewith.