[as discussed in de-mirror up to Aug 07, 1992]
[editorial changes / bug fixes by {cross,marion}@cs.tu-berlin.de Aug 15, 1992]
[info-line extensions by {heiko,vera,cross}@{cs.t,f}u-berlin.de Aug 22, 1992]
[info-line extensions frozen Aug 28, 1992]

		DRAFT Syntax for FTP server index files
		---------------------------------------


    index		= *( line CRLF )

    line		= comment-line
			/ info-line
			/ index-line

    comment-line	= "#" white-space text
					-- user information, format undefined

    info-line		= "#" 1*<any CHAR, excluding white-space and CRLF>
			  white-space text
					-- reserved for further parsable
					   information (contact addresses,
					   IP addresses...)
					   (preliminary standard see below)

    index-line		= directory-line
			/ symlink-line
			/ file-line

    directory-line	= ("D" / "d") 
			    ("R" / "r" / "-")
			    ("W" / "w" / "-")
			    ("X" / "x")
			    white-space
			    date-time white-space
			    "0" " "
			    pathname
					-- directories always have size 0. 
		   			   the search permission 'x' must
					   be set.

    file-line		= ("F" / "f")
			    ("R" / "r") 
			    ("W" / "w" / "-")
			    ("X" / "x" / "-")
			    white-space
			    date-time white-space
			    size " "
			    pathname
					-- files must be readable.
					   There is NO white-space between
					   size and pathname to support
					   pathnames with leading 
					   white-space.

    symlink-line 	= ("L" / "l")
			    "---"
			    white-space
			    date-time white-space
			    "0" " "
			    pathname 
			    " " "-" ">" " "
			    pathname
					-- symlinks have size 0 and
					   mode '---' by convention.
					   There is NO white-space
					   between the two pathnames
					   in order to support pathnames
					   containing white-space.

    date-time		= date " " time

    date		= day "-" month-name "-" year

    time		= hour ":" minute
					-- time should be given in GMT

    day			= ("0" / "1" / "2" / "3") 
			  DIGIT
					-- days < 10 have a leading 0.

    month-name		= ("Jan" / "Feb" / "Mar" / "Apr" / "May" /
			   "Jun" / "Jul" / "Aug" / "Sep" / "Oct" /
			   "Nov" / "Dec")

    year		= 4*DIGIT
					-- year should be >= 1970.

    hour		= 2*DIGIT
					-- in 24 hour notation; entries
					   < 10 have leading zeros

    minute		= 2*DIGIT	-- entries < 10 with leading
					   zeros

    size		= ( <any DIGIT except "0">  *( DIGIT ) )
			/ "0"

    pathname		= <any text not containing CRLF or " -> ">
					-- path components should be
					   divided by "/" (UNIX
					   pathname convention).

    text		= *( CHAR )
    
    white-space		= *( <ASCII SPACE> / <ASCII TAB>)

    token		= <text without white-space>

    CHAR		= <any ISO-8859-1 (8-bit ISO10646 subset) character>
					-- in POSIX.1, file names may
					   contain any printable
					   8-bit-character (at least,
					   I think so ;-)).

    NUMBER		= DIGIT *( DIGIT )

    DIGIT		= <any ASCII digit "0" .. "9">



	    valid Info Line keywords && formats (preliminary)
	    -------------------------------------------------
	      ( M = multiple lines allowed, ! = mandatory ) 

 !M server-name		= "#NAME" white-space token
					-- any CNAME, first occurrence
					   is preferred

  M contact-address	= "#MAIL" white-space *( token )
					-- RFC822 mail addresses

 !  index-version	= "#VERSION" white-space NUMBER "." NUMBER
					-- INDEX format version. MANDATORY.
					   Indices without a #VERSION-line
					   are illegal.

 !  create-date		= "#CREATED" white-space date-time
					-- index creation time, same timezone
					   and format as other INDEX dates.
					   Mandatory because it is used for
					   diffs.

    timezone		= ( "+" / "-" ) <four digits>
			  white-space text
					-- offset to GMT as in RFC822
					   text is optional and describes 
					   the timezone (not parsed)

    index-timezone	= "#INDEX-TIMEZONE" white-space timezone 
					-- timezone of INDEX dates,
					   always +0000

    server-timezone	= "#SERVER-TIMEZONE" white-space timezone
					-- server's home timezone

    organization	= "#ORGANIZATION" white-space text
					-- name of server's organization;
					   not parsed

    location		= "#LOCATION" white-space text
					-- server coordinates etc. (not spec)

    access		= "#ACCESS" white-space text
					-- access restrictions, not parsed.

    sort-field		= "date" / "path" / "filename"

    sort-specifier	= [ "casesensitive" white-space]
			  [ "reverse" white-space]
			  sort-field

    sort		= "#SORT" sort-specifier
					-- no sort line means unsorted
