Skip to content
Snippets Groups Projects
Select Git revision
  • 61c1cfc394bc2f787d6e34393e7059a26f3bdfd5
  • master default protected
  • streebog
  • gost28147
  • master-updates
  • ed448
  • shake256
  • curve448
  • ecc-sqrt
  • gosthash94cp
  • cmac64
  • block16-refactor
  • siv-mode
  • cmac-layout
  • delete-des-compat
  • delete-rsa_blind
  • aes-struct-layout
  • release-3.4-fixes
  • struct-layout
  • attribute-deprecated
  • rename-data-symbols
  • nettle_3.5.1_release_20190627
  • nettle_3.5_release_20190626
  • nettle_3.5rc1
  • nettle_3.4.1_release_20181204
  • nettle_3.4.1rc1
  • nettle_3.4_release_20171119
  • nettle_3.4rc2
  • nettle_3.4rc1
  • nettle_3.3_release_20161001
  • nettle_3.2_release_20160128
  • nettle_3.1.1_release_20150424
  • nettle_3.1_release_20150407
  • nettle_3.1rc3
  • nettle_3.1rc2
  • nettle_3.1rc1
  • nettle_3.0_release_20140607
  • nettle_2.7.1_release_20130528
  • nettle_2.7_release_20130424
  • nettle_2.6_release_20130116
  • nettle_2.5_release_20120707
41 results

serpent-encrypt.c

Blame
  • Forked from Nettle / nettle
    Source project has a limited visibility.
    ram-parse.c 44.85 KiB
    /*
     * $Id: ram-parse.c,v 0.39 1999/06/26 11:38:28 ceder Exp $
     * Copyright (C) 1991, 1993-1999  Lysator Academic Computer Association.
     *
     * This file is part of the LysKOM server.
     * 
     * LysKOM is free software; you can redistribute it and/or modify it
     * under the terms of the GNU General Public License as published by 
     * the Free Software Foundation; either version 1, or (at your option) 
     * any later version.
     * 
     * LysKOM is distributed in the hope that it will be useful, but WITHOUT
     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     * for more details.
     * 
     * You should have received a copy of the GNU General Public License
     * along with LysKOM; see the file COPYING.  If not, write to
     * Lysator, c/o ISY, Linkoping University, S-581 83 Linkoping, SWEDEN,
     * or the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, 
     * MA 02139, USA.
     *
     * Please mail bug reports to bug-lyskom@lysator.liu.se. 
     */
    /*#define DISKERR*/			/* Some corrections
    				   that are needed by diskomd 0.29.
    				   */
    /*
     * ram-parse.c -- parse objects from disk file.
     */
    
    
    #ifdef HAVE_CONFIG_H
    #  include <config.h>
    #endif
    
    static const char *
    rcsid = "$Id: ram-parse.c,v 0.39 1999/06/26 11:38:28 ceder Exp $";
    #include "rcs.h"
    USE(rcsid);
    
    #include <ctype.h>
    #include <stdio.h>
    #ifdef HAVE_STRING_H
    #  include <string.h>
    #endif
    #include <time.h>
    #include <sys/types.h>
    
    #include "s-string.h"
    #include "kom-types.h"
    #include "ram-parse.h"
    #include "log.h"
    #include "lyskomd.h"
    #include "server/smalloc.h"
    #include "kom-errno.h"
    #include "kom-memory.h"
    #include "local-to-global.h"
    
    static int input_format = 2;
    
    static Success fparse_text_list(FILE *fp, Local_to_global *result);
    
    void
    set_input_format(int fmt)
    {
        input_format = fmt;
        switch(fmt)
        {
        case 0:
        case 1:
        case 2:
            break;
        default:
            restart_kom("unknown input format selected: %d\n", fmt);
            break;
        }
    }
    
    
    /*
     * BUGS: Not all functions are needed.
     *	 The method for checking errors in fparse_long is ugly.
     *	 Errors in fparse_long are not always checked for.
     */
    
    #define REALLOC(ptr, size)  srealloc(ptr, size)
    
    static int fparse_long_errors = 0;
    
    void
    fskipwhite(FILE *fp)
    {
        int c;
    
        while ( (c = getc(fp)) != EOF && /* isascii(c) && */ isspace(c) )
    	;
    
        ungetc(c, fp);
    }
    
    extern unsigned long
    fparse_long(FILE *fp)
    {
        unsigned long res = 0;
        int foo = 0;
        int c;
    
        fskipwhite(fp);
        while ( (c = getc(fp)) != EOF && /* isascii(c) && */ isdigit(c))
        {
    	foo = 1;
    	res = 10 * res + c - '0';
        }
    
        if ( foo == 0 )
        {
    	kom_log("fparse_long() failed at pos %lu.\n", (unsigned long)ftell(fp));
    	++fparse_long_errors;
        }
        
        ungetc(c, fp);
    
        return res;
    }
    
    extern time_t
    fparse_time(FILE *fp)
    {
        return fparse_long(fp);
    }
    
    static Success
    fparse_info_0(FILE *fp, Info *info)
    {
        info->conf_pres_conf = fparse_long(fp);
        info->pers_pres_conf = fparse_long(fp);
        info->motd_conf      = fparse_long(fp);
        info->kom_news_conf  = fparse_long(fp);
        info->motd_of_lyskom = fparse_long(fp);
    
        return OK;
    }
    
    static Success
    fparse_info_2(FILE *fp, Info *info)
    {
        info->conf_pres_conf = fparse_long(fp);
        info->pers_pres_conf = fparse_long(fp);
        info->motd_conf      = fparse_long(fp);
        info->kom_news_conf  = fparse_long(fp);
        info->motd_of_lyskom = fparse_long(fp);
        info->highest_aux_no = fparse_long(fp);
        free_aux_item_list(&info->aux_item_list);
        return fparse_aux_item_list(fp, &info->aux_item_list);
    }
    
    extern Success
    fparse_info(FILE *fp, Info *info)
    {
        if ( fparse_long_errors != 0 )
        {
    	kom_log("fparse_info(): fparse_long_errors == %d on entry. Reset.\n",
    	    fparse_long_errors);
    	fparse_long_errors = 0;
        }
    
        switch (input_format)
        {
        case 0:
        case 1:
            return fparse_info_0(fp, info);
            break;
        case 2:
            return fparse_info_2(fp, info);
            break;
        default:
            restart_kom("unknown input format: %d\n", input_format);
            return FAILURE;
            break;
        }
    }
    
    
    
    static Success
    fparse_conference_2(FILE *fp,
                      Conference *result)
    {
        if ( fparse_long_errors != 0 )
        {
    	kom_log("fparse_conference(): fparse_long_errors == %d on entry. Reset.\n",
    	    fparse_long_errors);
    	fparse_long_errors = 0;
        }
    
        if ( fparse_string(fp, &result->name) != OK )
        {
    	kom_log("fparse_conference(): Can't parse name.\n");
    	return FAILURE;
        }
    
        if ( fparse_member_list(fp, &result->members) != OK
    	|| l2g_read(fp, &result->texts) != OK
    	|| fparse_conf_type(fp, &result->type) != OK )
        {
    	kom_log("fparse_conference: file is corrupt.\n");
    	return FAILURE;
        }
        
        result->creation_time = fparse_time(fp);
        result->last_written = fparse_time(fp);
    
        result->creator = fparse_long(fp);
        result->presentation = fparse_long(fp);
        result->supervisor = fparse_long(fp);
        result->permitted_submitters = fparse_long(fp);
        result->super_conf = fparse_long(fp);
        result->msg_of_day = fparse_long(fp);
    
        if ( fparse_long_errors != 0 )
        {
    	kom_log("fparse_conference(): %d %s before 'nice'. Reset.\n",
    	    fparse_long_errors, "fparse_long_errors");
    	fparse_long_errors = 0;
    	return FAILURE;
        }
    
        result->nice = fparse_long(fp);
    
    #ifdef DISKERR
        if ( fparse_long_errors != 0 )
        {
    	kom_log("fparse_conference(): Error parsing 'nice' at pos %d. "
    	    "nice set to 77 and error ignored.\n", ftell(fp));
    	fparse_long_errors = 0;
    	result->nice = 77;
        }
    
        if ( result->nice < 10 )
        {
    	char *name;
    	int new_nice;
    
    	name = s_crea_c_str(result->name);
    	new_nice = 10 * result->nice + 7;
    
    	if ( name == NULL )
    	{
    	    kom_log("fparse_conference(): nice in (null) was %d, set to %d.\n",
    		result->nice, new_nice);
    	}
    	else
    	{
    	    kom_log("fparse_conference(): nice in %s was %d, set to %d.\n",
    		name, result->nice, new_nice);
    	    string_free(name);
    	}
    
    	result->nice = new_nice;
        }
    #endif
    
        result->keep_commented = fparse_long(fp);
        result->expire = fparse_long(fp);
        result->highest_aux = fparse_long(fp);
        if (fparse_aux_item_list(fp, &result->aux_item_list) != OK)
            return FAILURE;
        fskipwhite(fp);
    
        return OK;
    }
    
    
    static Success
    fparse_conference_0(FILE *fp,
                      Conference *result)
    {
        if ( fparse_long_errors != 0 )
        {
    	kom_log("fparse_conference(): fparse_long_errors == %d on entry. Reset.\n",
    	    fparse_long_errors);
    	fparse_long_errors = 0;
        }
    
        if ( fparse_string(fp, &result->name) != OK )
        {
    	kom_log("fparse_conference(): Can't parse name.\n");
    	return FAILURE;
        }
    
        if ( fparse_member_list(fp, &result->members) != OK
    	|| fparse_text_list(fp, &result->texts) != OK
    	|| fparse_conf_type(fp, &result->type) != OK )
        {
    	kom_log("fparse_conference: file is corrupt.\n");
    	return FAILURE;
        }
        
        result->creation_time = fparse_time(fp);
        result->last_written = fparse_time(fp);
    
        result->creator = fparse_long(fp);
        result->presentation = fparse_long(fp);
        result->supervisor = fparse_long(fp);
        result->permitted_submitters = fparse_long(fp);
        result->super_conf = fparse_long(fp);
        result->msg_of_day = fparse_long(fp);
    
        if ( fparse_long_errors != 0 )
        {
    	kom_log("fparse_conference(): %d %s before 'nice'. Reset.\n",
    	    fparse_long_errors, "fparse_long_errors");
    	fparse_long_errors = 0;
    	return FAILURE;
        }
    
        result->nice = fparse_long(fp);
    
    #ifdef DISKERR
        if ( fparse_long_errors != 0 )
        {
    	kom_log("fparse_conference(): Error parsing 'nice' at pos %d. "
    	    "nice set to 77 and error ignored.\n", ftell(fp));
    	fparse_long_errors = 0;
    	result->nice = 77;
        }
    
        if ( result->nice < 10 )
        {
    	char *name;
    	int new_nice;
    
    	name = s_crea_c_str(result->name);
    	new_nice = 10 * result->nice + 7;
    
    	if ( name == NULL )
    	{
    	    kom_log("fparse_conference(): nice in (null) was %d, set to %d.\n",
    		result->nice, new_nice);
    	}
    	else
    	{
    	    kom_log("fparse_conference(): nice in %s was %d, set to %d.\n",
    		name, result->nice, new_nice);
    	    string_free(name);
    	}
    
    	result->nice = new_nice;
        }
    #endif
    
        result->highest_aux = 0;
        result->aux_item_list.length = 0;
        result->aux_item_list.items = 0;
    
        fskipwhite(fp);
        return OK;
    }
    
    extern Success
    fparse_conference(FILE *fp,
                      Conference *result)
    {
        switch (input_format)
        {
        case 0:
        case 1:
            return fparse_conference_0(fp, result);
            break;
        case 2:
            return fparse_conference_2(fp, result);
            break;
        default:
            restart_kom("unknown input format: %d\n", input_format);
            return FAILURE;
            break;
        }
    }
    
    
    static Success
    fparse_person_0(FILE *fp,
                    Person *person)
    {
        String pwd = EMPTY_STRING;
    
        if ( fparse_long_errors != 0 )
        {
    	kom_log("fparse_person(): fparse_long_errors == %d on entry. Reset.\n",
    	    fparse_long_errors);
    	fparse_long_errors = 0;
        }
    
        if ( fparse_string(fp, &pwd) != OK )
        {
    	kom_log("fparse_person(): Failed to parse password.\n");
    	return FAILURE;
        }
    
        memcpy(person->pwd, pwd.string, PASSWD_LEN);
        s_clear(&pwd);
        	
        if ( fparse_string(fp, &person->username) != OK
    	|| fparse_priv_bits(fp, &person->privileges) != OK
    	|| fparse_personal_flags(fp, &person->flags) != OK
    	|| fparse_text_list(fp, &person->created_texts) != OK
    	|| fparse_mark_list(fp, &person->marks) != OK 
    	|| fparse_membership_list(fp, &person->conferences) != OK )
        {
    	kom_log("fparse_person(): parse error.\n");
    	return FAILURE;
        }
    
        person->last_login = fparse_time(fp);
    
        person->user_area = fparse_long(fp);
        person->total_time_present = fparse_long(fp);
        person->sessions = fparse_long(fp);
        person->created_lines = fparse_long(fp);
        person->created_bytes = fparse_long(fp);
        person->read_texts = fparse_long(fp);
        person->no_of_text_fetches = fparse_long(fp);
        person->created_persons = fparse_long(fp);
    
        if ( fparse_long_errors != 0 )
        {
    	kom_log("fparse_person(): %d %s before 'created_confs'. Reset.\n",
    	    fparse_long_errors, "fparse_long_errors");
    	fparse_long_errors = 0;
    	return FAILURE;
        }
    
        person->created_confs = fparse_long(fp);
    
    #ifdef DISKERR
        if ( fparse_long_errors != 0 )
        {
    	kom_log("fparse_person(): Error parsing 'created_confs' at pos %d. "
    	    "created_confs set to 0 and error ignored.\n", ftell(fp));
    	fparse_long_errors = 0;
    	person->created_confs = 0;
        }
    #endif
    
        fskipwhite(fp);
        return OK;
    }
    
    static Success
    fparse_person_2(FILE *fp,
                    Person *person)
    {
        String pwd = EMPTY_STRING;
    
        if ( fparse_long_errors != 0 )
        {
    	kom_log("fparse_person(): fparse_long_errors == %d on entry. Reset.\n",
    	    fparse_long_errors);
    	fparse_long_errors = 0;
        }
    
        if ( fparse_string(fp, &pwd) != OK )
        {
    	kom_log("fparse_person(): Failed to parse password.\n");
    	return FAILURE;
        }
    
        memcpy(person->pwd, pwd.string, PASSWD_LEN);
        s_clear(&pwd);
        	
        if ( fparse_string(fp, &person->username) != OK
    	|| fparse_priv_bits(fp, &person->privileges) != OK
    	|| fparse_personal_flags(fp, &person->flags) != OK
    	|| l2g_read(fp, &person->created_texts) != OK
    	|| fparse_mark_list(fp, &person->marks) != OK 
    	|| fparse_membership_list(fp, &person->conferences) != OK )
        {
    	kom_log("fparse_person(): parse error.\n");
    	return FAILURE;
        }
    
        person->last_login = fparse_time(fp);
    
        person->user_area = fparse_long(fp);
        person->total_time_present = fparse_long(fp);
        person->sessions = fparse_long(fp);
        person->created_lines = fparse_long(fp);
        person->created_bytes = fparse_long(fp);
        person->read_texts = fparse_long(fp);
        person->no_of_text_fetches = fparse_long(fp);
        person->created_persons = fparse_long(fp);
    
        if ( fparse_long_errors != 0 )
        {
    	kom_log("fparse_person(): %d %s before 'created_confs'. Reset.\n",
    	    fparse_long_errors, "fparse_long_errors");
    	fparse_long_errors = 0;
    	return FAILURE;
        }
    
        person->created_confs = fparse_long(fp);
    
    #ifdef DISKERR
        if ( fparse_long_errors != 0 )
        {
    	kom_log("fparse_person(): Error parsing 'created_confs' at pos %d. "
    	    "created_confs set to 0 and error ignored.\n", ftell(fp));
    	fparse_long_errors = 0;
    	person->created_confs = 0;
        }
    #endif
    
        fskipwhite(fp);
    
        return OK;
    }
    
    extern Success
    fparse_person(FILE *fp,
                  Person *result)
    {
        switch(input_format)
        {
        case 0:
        case 1:
            return fparse_person_0(fp, result);
            break;
        case 2:
            return fparse_person_2(fp, result);
            break;
        default:
            restart_kom("unknown input format: %d\n", input_format);
            return FAILURE;
            break;
        }
    }
    
    static Success
    fparse_membership_type(FILE *fp,
                           Membership_type *result)
    {
        fskipwhite(fp);
        
        result->invitation = getc(fp) != '0';
        result->passive    = getc(fp) != '0';
        result->secret     = getc(fp) != '0';
        result->reserved1  = getc(fp) != '0';
        result->reserved2  = getc(fp) != '0';
        result->reserved3  = getc(fp) != '0';
        result->reserved4  = getc(fp) != '0';
        result->reserved5  = getc(fp) != '0';
    
        return OK;
    }
    
    static Success
    fparse_membership_2(FILE *fp,
                        Membership *mship)
    {
        int i;
        
        mship->last_time_read = fparse_time(fp);
    
        mship->conf_no = fparse_long(fp);
        mship->priority = fparse_long(fp);
        mship->last_text_read = fparse_long(fp);
        mship->no_of_read = fparse_long(fp);
    
        if ( mship->no_of_read > 0)
        {
    	fskipwhite(fp);
    	switch(getc(fp))
    	{
    	case '{':
    	    mship->read_texts
    		= REALLOC(mship->read_texts, (mship->no_of_read
    					      * sizeof(Local_text_no)));
    	    if ( mship->read_texts == NULL )
    	    {
                    err_stat = 0;
    		kom_errno = KOM_OUT_OF_MEMORY;
    		return FAILURE;
    	    }
    
    	    for ( i = 0; i < mship->no_of_read; i++)
    		mship->read_texts[ i ] = fparse_long(fp);
    
    	    fskipwhite(fp);
    	    if ( getc(fp) != '}' )
    	    {
                    err_stat = 1;
    		kom_errno = KOM_LDB_ERR;
    		kom_log("fparse_membership(): expected '}' at pos %lu.\n",
    		    (unsigned long)ftell(fp));
    		return FAILURE;
    	    }
    	    break;
    	    
    	case '*':
    	    if ( mship->read_texts != NULL )
    	    {
    		sfree(mship->read_texts);
    		mship->read_texts = NULL;
    	    }
    	    kom_log("fparse_membership(): %s with %lu elements (corrected)\n",
    		"empty read_texts", (unsigned long)mship->no_of_read);
    	    mship->no_of_read = 0;
    	    break;
    	default:
    	    kom_log("fparse_membership(): expected '*' or '{' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 2;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
        }
        else
        {
    	fskipwhite(fp);
    	if ( getc(fp) != '*' ) 
    	{
    	    kom_log("fparse_membership(): expected '*' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 3;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
    
    	if ( mship->read_texts != NULL )
    	{
    	    sfree(mship->read_texts);
    	    mship->read_texts = NULL;
    	}
        }
    
        mship->added_by = fparse_long(fp);
        mship->added_at = fparse_time(fp);
        if (fparse_membership_type(fp, &mship->type) != OK)
            return FAILURE;
    
        return OK;
    }
    
    static Success
    fparse_membership_0(FILE *fp,
                        Membership *mship)
    {
        int i;
        
        mship->last_time_read = fparse_time(fp);
    
        mship->conf_no = fparse_long(fp);
        mship->priority = fparse_long(fp);
        mship->last_text_read = fparse_long(fp);
        mship->no_of_read = fparse_long(fp);
    
        if ( mship->no_of_read > 0)
        {
    	fskipwhite(fp);
    	switch(getc(fp))
    	{
    	case '{':
    	    mship->read_texts
    		= REALLOC(mship->read_texts, (mship->no_of_read
    					      * sizeof(Local_text_no)));
    	    if ( mship->read_texts == NULL )
    	    {
                    err_stat = 0;
    		kom_errno = KOM_OUT_OF_MEMORY;
    		return FAILURE;
    	    }
    
    	    for ( i = 0; i < mship->no_of_read; i++)
    		mship->read_texts[ i ] = fparse_long(fp);
    
    	    fskipwhite(fp);
    	    if ( getc(fp) != '}' )
    	    {
                    err_stat = 1;
    		kom_errno = KOM_LDB_ERR;
    		kom_log("fparse_membership(): expected '}' at pos %lu.\n",
    		    (unsigned long)ftell(fp));
    		return FAILURE;
    	    }
    	    break;
    	    
    	case '*':
    	    if ( mship->read_texts != NULL )
    	    {
    		sfree(mship->read_texts);
    		mship->read_texts = NULL;
    	    }
    	    kom_log("fparse_membership(): %s with %lu elements (corrected)\n",
    		"empty read_texts", (unsigned long)mship->no_of_read);
    	    mship->no_of_read = 0;
    	    break;
    	default:
    	    kom_log("fparse_membership(): expected '*' or '{' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 2;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
        }
        else
        {
    	fskipwhite(fp);
    	if ( getc(fp) != '*' ) 
    	{
    	    kom_log("fparse_membership(): expected '*' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 3;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
    
    	if ( mship->read_texts != NULL )
    	{
    	    sfree(mship->read_texts);
    	    mship->read_texts = NULL;
    	}
        }
    
        return OK;
    }
    
    static Success
    fparse_membership(FILE *fp,
                      Membership *mship)
    {
        switch(input_format)
        {
        case 0:
        case 1:
            return fparse_membership_0(fp, mship);
            break;
        case 2:
            return fparse_membership_2(fp, mship);
            break;
        default:
            restart_kom("unknown input format: %d\n", input_format);
            return FAILURE;
            break;
        }
    }
    
    
    	
    static Success
    fparse_membership_list_0(FILE *fp,
                             Membership_list *result)
    {
        int i;
        
        /* First free all the read_texts. */
    
        if ( result->confs != NULL )
        {
    	for ( i = 0; i < result->no_of_confs; i++)
    	    sfree(result->confs[ i ].read_texts);
        }
        
        result->no_of_confs = fparse_long(fp);
    
        if ( result->no_of_confs > 0 )
        {
    	fskipwhite(fp);
    	switch(getc(fp))
    	{
    	case '{':
    	    result->confs = REALLOC(result->confs,
    					  (result->no_of_confs
    					   * sizeof(Membership)));
    	    if ( result->confs == NULL && result->no_of_confs > 0 )
    	    {
                    err_stat = 0;
    		kom_errno = KOM_OUT_OF_MEMORY;
    		return FAILURE;
    	    }
    
    	    for ( i = 0; i < result->no_of_confs; i++)
    	    {
    	        init_membership(&result->confs[ i ]);
    		if ( fparse_membership_0(fp, &result->confs[i]) != OK )
    		    return FAILURE;
    	    }
    	    
    	    fskipwhite(fp);
    	    if ( getc(fp) != '}' )
    	    {
    		kom_log("fparse_membership_list(): expected '}' at pos %lu.\n",
    		    (unsigned long)ftell(fp));
                    err_stat = 4;
    		kom_errno = KOM_LDB_ERR;
    		return FAILURE;
    	    }
    	    
    	    break;
    	case '*':
    	    if ( result->confs != NULL )
    	    {
    		sfree(result->confs);
    		result->confs = NULL;
    	    }
    	    kom_log("%s empty list with %lu elements (corrected).\n",
    		"fparse_membership_list():",
    		(unsigned long)result->no_of_confs);
    	    
    	    result->no_of_confs = 0;
    	    break;
    	default:
    	    kom_log("fparse_membership_list(): expected '*' or '{' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 5;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
        }
        else
        {
    	fskipwhite(fp);
    	if ( getc(fp) != '*' ) 
    	{
    	    kom_log("fparse_membership_list(): expected '*' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 6;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
    	if ( result->confs != NULL )
    	{
    	    sfree(result->confs);
    	    result->confs = NULL;
    	}
        }
        return OK;
    }
    
    static Success
    fparse_membership_list_2(FILE *fp,
                             Membership_list *result)
    {
        int i;
        
        /* First free all the read_texts. */
    
        if ( result->confs != NULL )
        {
    	for ( i = 0; i < result->no_of_confs; i++)
    	    sfree(result->confs[ i ].read_texts);
        }
        
        result->no_of_confs = fparse_long(fp);
    
        if ( result->no_of_confs > 0 )
        {
    	fskipwhite(fp);
    	switch(getc(fp))
    	{
    	case '{':
    	    result->confs = REALLOC(result->confs,
    					  (result->no_of_confs
    					   * sizeof(Membership)));
    	    if ( result->confs == NULL && result->no_of_confs > 0 )
    	    {
                    err_stat = 0;
    		kom_errno = KOM_OUT_OF_MEMORY;
    		return FAILURE;
    	    }
    
    	    for ( i = 0; i < result->no_of_confs; i++)
    	    {
    	        init_membership(&result->confs[ i ]);
    		if ( fparse_membership(fp, &result->confs[i]) != OK )
    		    return FAILURE;
    	    }
    	    
    	    fskipwhite(fp);
    	    if ( getc(fp) != '}' )
    	    {
    		kom_log("fparse_membership_list(): expected '}' at pos %lu.\n",
    		    (unsigned long)ftell(fp));
                    err_stat = 4;
    		kom_errno = KOM_LDB_ERR;
    		return FAILURE;
    	    }
    	    
    	    break;
    	case '*':
    	    if ( result->confs != NULL )
    	    {
    		sfree(result->confs);
    		result->confs = NULL;
    	    }
    	    kom_log("%s empty list with %lu elements (corrected).\n",
    		"fparse_membership_list():",
    		(unsigned long)result->no_of_confs);
    	    
    	    result->no_of_confs = 0;
    	    break;
    	default:
    	    kom_log("fparse_membership_list(): expected '*' or '{' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 5;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
        }
        else
        {
    	fskipwhite(fp);
    	if ( getc(fp) != '*' ) 
    	{
    	    kom_log("fparse_membership_list(): expected '*' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 6;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
    	if ( result->confs != NULL )
    	{
    	    sfree(result->confs);
    	    result->confs = NULL;
    	}
        }
        return OK;
    }
    
    
    extern Success
    fparse_membership_list(FILE *fp,
                           Membership_list *result)
    {
        switch(input_format)
        {
        case 0:
        case 1:
            return fparse_membership_list_0(fp, result);
            break;
        case 2:
            return fparse_membership_list_2(fp, result);
            break;
        default:
            restart_kom("unknown input format: %d\n", input_format);
            return FAILURE;
            break;
        }
    }
    
    
    
    extern Success
    fparse_conf_list(FILE *fp,
    		Conf_list_old *result)
    {
        unsigned long i;
    
        result->no_of_conf_nos = fparse_long(fp);
        if ( result->no_of_conf_nos > 0 )
        {
    	fskipwhite(fp);
    	switch(getc(fp))
    	{
    	case '{':
    	    result->conf_nos = REALLOC(result->conf_nos,
    				       (result->no_of_conf_nos
    					* sizeof(Conf_no)));
    	    if ( result->conf_nos == NULL )
    	    {
                    err_stat = 0;
    		kom_errno = KOM_OUT_OF_MEMORY;
    		return FAILURE;
    	    }
    	    
    	    for ( i = 0; i < result->no_of_conf_nos; i++)
    		result->conf_nos[ i ] = fparse_long(fp);
    	    
    	    fskipwhite(fp);
    	    if ( getc(fp) != '}' )
    	    {
    		kom_log("fparse_conf_list(): expected '}' at pos %lu.\n",
    		    (unsigned long)ftell(fp));
                    err_stat = 7;
    		kom_errno = KOM_LDB_ERR;
    		return FAILURE;
    	    }
    	    
    	    break;
    	case '*':
    	    if ( result->conf_nos != NULL )
    	    {
    		sfree(result->conf_nos);
    		result->conf_nos = NULL;
    	    }
    	    break;
    	default:
    	    kom_log("fparse_conf_list(): expected '*' or '{' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 8;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
        }
        else
        {
    	fskipwhite(fp);
    	if ( getc(fp) != '*' ) 
    	{
    	    kom_log("fparse_conf_list(): expected '*' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 9;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
    	if ( result->conf_nos != NULL )
    	{
    	    sfree(result->conf_nos);
    	    result->conf_nos = NULL;
    	}
        }
    
        if ( result->no_of_conf_nos > 0 )
        {
    	fskipwhite(fp);
    	switch(getc(fp))
    	{
    	case '{':
    	    result->type_of_conf = REALLOC(result->type_of_conf,
    					   (result->no_of_conf_nos
    					    * sizeof(Conf_type)));
    
    	    if ( result->type_of_conf == NULL )
    	    {
                    err_stat = 0;
    		kom_errno = KOM_OUT_OF_MEMORY;
    		return FAILURE;
    	    }
    	    
    	    for ( i = 0; i < result->no_of_conf_nos; i++)
    		if ( fparse_conf_type(fp, &result->type_of_conf[i]) != OK )
    		{
    		    return FAILURE;
    		}
    	    
    	    fskipwhite(fp);
    	    if ( getc(fp) != '}' )
    	    {
    		kom_log("fparse_conf_list(): expected '}' at pos %lu.\n",
    		    (unsigned long)ftell(fp));
                    err_stat = 10;
    		kom_errno = KOM_LDB_ERR;
    		return FAILURE;
    	    }
    	    
    	    break;
    	case '*':
    	    if ( result->type_of_conf != NULL )
    	    {
    		sfree(result->type_of_conf);
    		result->type_of_conf = NULL;
    	    }
    	    break;
    	default:
    	    kom_log("fparse_conf_list(): expected '*' or '+' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 11;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
        }
        else
        {
    	fskipwhite(fp);
    	if ( getc(fp) != '*' ) 
    	{
    	    kom_log("fparse_conf_list(): expected '*' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 12;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
    
    	if ( result->type_of_conf != NULL )
    	{
    	    sfree(result->type_of_conf);
    	    result->type_of_conf = NULL;
    	}
        }
        return OK;
    }
    
    
    extern Success
    fparse_mark_list(FILE *fp,
    		Mark_list *result)
    {
        int i;
    
        result->no_of_marks = fparse_long(fp);
    
        if ( result->no_of_marks > 0 )
        {
    	fskipwhite(fp);
    	switch(getc(fp))
    	{
    	case '{':
    	    result->marks = REALLOC(result->marks,
    				    (result->no_of_marks
    				     * sizeof(Mark)));
    
    	    if ( result->marks == NULL )
    	    {
                    err_stat = 0;
    		kom_errno = KOM_OUT_OF_MEMORY;
    		return FAILURE;
    	    }
    	    
    	    for ( i = 0; i < result->no_of_marks; i++)
    		if ( fparse_mark(fp, &result->marks[ i ] ) != OK )
    		{
    		    return FAILURE;
    		}
    	    
    	    fskipwhite(fp);
    	    if ( getc(fp) != '}' )
    	    {
    		kom_log("fparse_mark_list(): expected '}' at pos %lu.\n",
    		    (unsigned long)ftell(fp));
                    err_stat = 13;
    		kom_errno = KOM_LDB_ERR;
    		return FAILURE;
    	    }
    	    
    	    break;
    
    	case '*':
    	    if ( result->marks != NULL )
    	    {
    		sfree(result->marks);
    		result->marks = NULL;
    	    }
    	    break;
    
    	default:
    	    kom_log("fparse_mark_list(): expected '*' or '{' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 14;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
        }
        else
        {
    	fskipwhite(fp);
    	if ( getc(fp) != '*' ) 
    	{
    	    kom_log("fparse_mark_list(): expected '*' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 15;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
    	if ( result->marks != NULL )
    	{
    	    sfree(result->marks);
    	    result->marks = NULL;
    	}
        }
        return OK;
    }
    
    static Success
    fparse_text_stat_2(FILE *fp,
                       Text_stat *result)
    {
        int i;
        int c;
    
        if ( fparse_long_errors != 0 )
        {
    	kom_log("fparse_text_stat(): fparse_long_errors == %d on entry. Reset.\n",
    	    fparse_long_errors);
    	fparse_long_errors = 0;
        }
    
        result->creation_time = fparse_time(fp);
    
        result->author = fparse_long(fp);
        result->file_pos = fparse_long(fp);
        result->no_of_lines = fparse_long(fp);
        result->no_of_chars = fparse_long(fp);
        result->no_of_marks = fparse_long(fp);
        result->no_of_misc = fparse_long(fp);
    
        if ( fparse_long_errors != 0 )
        {
    	kom_log("%s(): %d fparse_long_errors before 'misc_items'. Reset.\n",
    	    "fparse_text_stat",
    	    fparse_long_errors);
    	fparse_long_errors = 0;
    	return FAILURE;
        }
    
        if ( result->no_of_misc > 0 )
        {
    	fskipwhite(fp);
    	switch( c = getc(fp) )
    	{
    	case '{':
    	    result->misc_items = REALLOC(result->misc_items,
    					 (result->no_of_misc
    					  * sizeof(Misc_info)));
    
    	    if ( result->misc_items == NULL )
    	    {
                    err_stat = 0;
    		kom_errno = KOM_OUT_OF_MEMORY;
    		return FAILURE;
    	    }
    	    
    	    for ( i = 0; i < result->no_of_misc; i++)
    		if ( fparse_misc_info(fp, &result->misc_items[ i ]) != OK )
    		    return FAILURE;
    	    
    	    fskipwhite(fp);
    	    if ( (c = getc(fp)) != '}' )
    	    {
    #ifdef DISKERR
    		if ( c == '@' || c == '+' )
    		{
    		    ungetc(c, fp);
    		    kom_log("fparse_text_stat(): got '%c' when expecting '}'.\n."
    			"Character ungetc'd and interpreted as a '}'."
    			" (pos %d).\n", c, ftell(fp));
    		}
    		else
    #endif
    		{
    		    kom_log("fparse_text_stat(): expected '}' at pos %lu.\n",
    			(unsigned long)ftell(fp));
                        err_stat = 16;
    		    kom_errno = KOM_LDB_ERR;
    		    return FAILURE;
    		}
    	    }
    
    	    break;
    
    	case '@':
    	case '+':
    	    ungetc(c, fp);
    	    kom_log("fparse_text_stat(): got '%c'; expected '{' or '*'\n.", c);
    	    kom_log("Character ungetc'd and interpreted as a '*'. (pos %lu).\n",
    		(unsigned long)ftell(fp));
    	    /* Fall through */
    	case '*':
    	    if ( result->misc_items != NULL )
    	    {
    		sfree(result->misc_items);
    		result->misc_items = NULL;
    	    }
    	    break;
    
    	default:
    	    kom_log("fparse_text_stat(): expected '*' or '}' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 17;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
        }
        else
        {
    	fskipwhite(fp);
    	if ( (c = getc(fp)) != '*' ) 
    	{
    #ifdef DISKERR
    	    if ( c == '@' || c == '+' )
    	    {
    		ungetc(c, fp);
    		kom_log("fparse_text_stat(): got '%c' when expecting '*'.\n."
    		    "Character ungetc'd and interpreted as a '*'."
    		    " (pos %d).\n", c, ftell(fp));
    	    }
    	    else
    #endif
    	    {
    		kom_log("fparse_text_stat(): expected '*' at pos %lu.\n",
    		    (unsigned long)ftell(fp));
                    err_stat = 18;
    		kom_errno = KOM_LDB_ERR;
    		return FAILURE;
    	    }
    	}
    
    	if ( result->misc_items != NULL )
    	{
    	    sfree(result->misc_items);
    	    result->misc_items = NULL;
    	}
        }
    
        result->highest_aux = fparse_long(fp);
        if (fparse_aux_item_list(fp, &result->aux_item_list) != OK)
            return FAILURE;
    
        fskipwhite(fp);
    
        return OK;
    }
    
    static Success
    fparse_text_stat_0(FILE *fp,
                       Text_stat *result)
    {
        int i;
        int c;
    
        if ( fparse_long_errors != 0 )
        {
    	kom_log("fparse_text_stat(): fparse_long_errors == %d on entry. Reset.\n",
    	    fparse_long_errors);
    	fparse_long_errors = 0;
        }
    
        result->creation_time = fparse_time(fp);
    
        result->author = fparse_long(fp);
        result->file_pos = fparse_long(fp);
        result->no_of_lines = fparse_long(fp);
        result->no_of_chars = fparse_long(fp);
        result->no_of_marks = fparse_long(fp);
        result->no_of_misc = fparse_long(fp);
    
        if ( fparse_long_errors != 0 )
        {
    	kom_log("%s(): %d fparse_long_errors before 'misc_items'. Reset.\n",
    	    "fparse_text_stat",
    	    fparse_long_errors);
    	fparse_long_errors = 0;
    	return FAILURE;
        }
    
        if ( result->no_of_misc > 0 )
        {
    	fskipwhite(fp);
    	switch( c = getc(fp) )
    	{
    	case '{':
    	    result->misc_items = REALLOC(result->misc_items,
    					 (result->no_of_misc
    					  * sizeof(Misc_info)));
    
    	    if ( result->misc_items == NULL )
    	    {
                    err_stat = 0;
    		kom_errno = KOM_OUT_OF_MEMORY;
    		return FAILURE;
    	    }
    	    
    	    for ( i = 0; i < result->no_of_misc; i++)
    		if ( fparse_misc_info(fp, &result->misc_items[ i ]) != OK )
    		    return FAILURE;
    	    
    	    fskipwhite(fp);
    	    if ( (c = getc(fp)) != '}' )
    	    {
    #ifdef DISKERR
    		if ( c == '@' || c == '+' )
    		{
    		    ungetc(c, fp);
    		    kom_log("fparse_text_stat(): got '%c' when expecting '}'.\n."
    			"Character ungetc'd and interpreted as a '}'."
    			" (pos %d).\n", c, ftell(fp));
    		}
    		else
    #endif
    		{
    		    kom_log("fparse_text_stat(): expected '}' at pos %lu.\n",
    			(unsigned long)ftell(fp));
                        err_stat = 19;
    		    kom_errno = KOM_LDB_ERR;
    		    return FAILURE;
    		}
    	    }
    
    	    break;
    
    	case '@':
    	case '+':
    	    ungetc(c, fp);
    	    kom_log("fparse_text_stat(): got '%c'; expected '{' or '*'\n.", c);
    	    kom_log("Character ungetc'd and interpreted as a '*'. (pos %lu).\n",
    		(unsigned long)ftell(fp));
    	    /* Fall through */
    	case '*':
    	    if ( result->misc_items != NULL )
    	    {
    		sfree(result->misc_items);
    		result->misc_items = NULL;
    	    }
    	    break;
    
    	default:
    	    kom_log("fparse_text_stat(): expected '*' or '}' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 20;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
        }
        else
        {
    	fskipwhite(fp);
    	if ( (c = getc(fp)) != '*' ) 
    	{
    #ifdef DISKERR
    	    if ( c == '@' || c == '+' )
    	    {
    		ungetc(c, fp);
    		kom_log("fparse_text_stat(): got '%c' when expecting '*'.\n."
    		    "Character ungetc'd and interpreted as a '*'."
    		    " (pos %d).\n", c, ftell(fp));
    	    }
    	    else
    #endif
    	    {
    		kom_log("fparse_text_stat(): expected '*' at pos %lu.\n",
    		    (unsigned long)ftell(fp));
                    err_stat = 21;
    		kom_errno = KOM_LDB_ERR;
    		return FAILURE;
    	    }
    	}
    
    	if ( result->misc_items != NULL )
    	{
    	    sfree(result->misc_items);
    	    result->misc_items = NULL;
    	}
        }
    
        result->highest_aux = 0;
        result->aux_item_list.length = 0;
        result->aux_item_list.items = NULL;
    
        fskipwhite(fp);
        return OK;
    }
    
    extern Success
    fparse_text_stat(FILE *fp,
                     Text_stat *result)
    {
        switch(input_format)
        {
        case 0:
        case 1:
            return fparse_text_stat_0(fp, result);
            break;
        case 2:
            return fparse_text_stat_2(fp, result);
            break;
        default:
            restart_kom("unknown input format: %d\n", input_format);
            return FAILURE;
            break;
        }
    }
    
    
    static Success
    fparse_text_list(FILE *fp,
    		Local_to_global *result)
    {
        unsigned long i;
        Local_text_no lno;
        Local_text_no no_of_texts;
    
        lno = fparse_long(fp);
        no_of_texts = fparse_long(fp);
        l2g_clear(result);
    
        if (no_of_texts > 0)
        {
    	fskipwhite(fp);
    	switch(getc(fp))
    	{
    	case '{':
    	    for ( i = 0; i < no_of_texts; i++)
    		l2g_append(result, lno++, fparse_long(fp));
    	    
    	    fskipwhite(fp);
    	    if ( getc(fp) != '}' )
    	    {
    		kom_log("fparse_text_list(): expected '}' at pos %lu.\n",
    		    (unsigned long)ftell(fp));
                    err_stat = 22;
    		kom_errno = KOM_LDB_ERR;
    		return FAILURE;
    	    }
    	    
    	    break;
    
    	default:
    	    kom_log("fparse_text_list(): expected '{' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 23;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
        }
        else
        {
    	fskipwhite(fp);
    	if ( getc(fp) != '*' ) 
    	{
    	    kom_log("fparse_text_list(): expected '*' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 24;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
    	l2g_set_first_appendable_key(result, lno);
        }
        return OK;
    }
        
    
    extern Success
    fparse_string(FILE *fp,
    	     String *result)
    {
        String_size length;
       
        length = fparse_long(fp);
    
        if ( getc(fp) != 'H' )
        {
    	kom_log("fparse_string(): expected 'H' at pos %lu.\n",
    	    (unsigned long)ftell(fp));
            err_stat = 25;
    	kom_errno = KOM_LDB_ERR;
    	return FAILURE;
        }
    
        s_size_crea_str(result, length);
        
        if ( result->string == NULL )
        {
            err_stat = 0;
            kom_errno = KOM_OUT_OF_MEMORY;
    	return FAILURE;
        }
        
        if ( fread(result->string, sizeof(char), result->len, fp)
    	!= (size_t)result->len )
        {
    	kom_log("fparse_string(): unexpected eof at pos %lu.\n",
    	    (unsigned long)ftell(fp));
            err_stat = 26;
    	kom_errno = KOM_LDB_ERR;
    	return FAILURE;
        }
        
        return OK;
    }
    
    extern Success
    fparse_member_list(FILE *fp,
    		  Member_list *result)
    {
        int i;
    
        result->no_of_members = fparse_long(fp);
        if ( result->no_of_members > 0 )
        {
    	fskipwhite(fp);
    	switch(getc(fp))
    	{
    	case '{':
    	    result->members = REALLOC(result->members,
    				      (result->no_of_members
    				       * sizeof(Member)));
    
    	    if ( result->members == NULL )
    	    {
                    err_stat = 0;
    		kom_errno = KOM_OUT_OF_MEMORY;
    		return FAILURE;
    	    }
    	    
    	    for ( i = 0; i < result->no_of_members; i++)
                {
                    init_member(&result->members[i]);
    		if ( fparse_member(fp, &result->members[ i ]) != OK )
    		{
    		    return FAILURE;
    		}
                }
    	    
    	    
    	    fskipwhite(fp);
    	    if ( getc(fp) != '}' )
    	    {
    		kom_log("fparse_member_list(): expected '}' at pos %lu.\n",
    		    (unsigned long)ftell(fp));
                    err_stat = 27;
    		kom_errno = KOM_LDB_ERR;
    		return FAILURE;
    	    }
    	    
    	    break;
    
    	case '*':
    	    if ( result->members != NULL )
    	    {
    		sfree(result->members);
    		result->members = NULL;
    	    }
    	    break;
    
    	default:
    	    kom_log("fparse_member_list(): expected '*' or '{' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 28;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
        }
        else
        {
    	fskipwhite(fp);
    	if ( getc(fp) != '*' ) 
    	{
    	    kom_log("fparse_member_list(): expected '*' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 29;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
    	if ( result->members != NULL )
    	{
    	    sfree(result->members);
    	    result->members = NULL;
    	}
        }
        return OK;
    }
    
    
    static Success
    fparse_member_0(FILE *fp,
                    Member *result)
    {
        result->member = fparse_long(fp);
        return OK;
    }
    
    static Success
    fparse_member_2(FILE *fp,
                    Member *result)
    {
        result->member = fparse_long(fp);
        result->added_by = fparse_long(fp);
        result->added_at = fparse_time(fp);
        return fparse_membership_type(fp, &result->type);
    }
    
    extern Success
    fparse_member(FILE *fp,
    	     Member *result)
    {
        switch (input_format)
        {
        case 0:
        case 1:
            return fparse_member_0(fp, result);
            break;
        case 2:
            return fparse_member_2(fp, result);
            break;
        default:
            restart_kom("unknown database format: %d", input_format);
            return FAILURE;
        }
    }
    
    extern Success
    fparse_mark(FILE *fp,
    	   Mark *result)
    {
        result->text_no = fparse_long(fp);
        result->mark_type = fparse_long(fp);
        return OK;
    }
    
    
    extern Success
    fparse_priv_bits(FILE *fp,
    		Priv_bits *result)
    {
        fskipwhite(fp);
    
        result->wheel = getc(fp) != '0';
        result->admin = getc(fp) != '0';
        result->statistic = getc(fp) != '0';
        result->create_pers = getc(fp) != '0';
        result->create_conf = getc(fp) != '0';
        result->change_name = getc(fp) != '0';
        result->extern_gw = getc(fp) != '0';
        result->flg8 = getc(fp) != '0';
        result->flg9 = getc(fp) != '0';
        result->flg10 = getc(fp) != '0';
        result->flg11 = getc(fp) != '0';
        result->flg12 = getc(fp) != '0';
        result->flg13 = getc(fp) != '0';
        result->flg14 = getc(fp) != '0';
        result->flg15 = getc(fp) != '0';
        result->flg16 = getc(fp) != '0';
    
        return OK;
    }
    
    
    extern Success
    fparse_personal_flags(FILE *fp,
    		     Personal_flags *result)
    {
        fskipwhite(fp);
        
        result->unread_is_secret = getc(fp) != '0';
        result->flg2 = getc(fp) != '0';
        result->flg3 = getc(fp) != '0';
        result->flg4 = getc(fp) != '0';
        result->flg5 = getc(fp) != '0';
        result->flg6 = getc(fp) != '0';
        result->flg7 = getc(fp) != '0';
        result->flg8 = getc(fp) != '0';
    
        return OK;
    }	
    
    extern Success
    fparse_conf_type(FILE *fp,
    		Conf_type *result)
    {
        char c;
        
        fskipwhite(fp);
        
        result->rd_prot = getc(fp) != '0';
        result->original = getc(fp) != '0';
        result->secret = getc(fp) != '0';
        result->letter_box = getc(fp) != '0';
        c = getc(fp);
        if (c != '0' && c != '1')
        {
            result->allow_anon = 1;
    	result->forbid_secret = 0;
    	result->reserved2 = 0;
    	result->reserved3 = 0;
    	ungetc(c, fp);
    	return(OK);
        }
    
        result->allow_anon =   ( c != '0' );
        result->forbid_secret = ( getc(fp) != '0' );
        result->reserved2 = ( getc(fp) != '0' );
        result->reserved3 = ( getc(fp) != '0' );
    
        return OK;
    }
    
    
    extern Success
    fparse_who_info(FILE *fp,
    	       Who_info *result)
    {
        result->person = fparse_long(fp);
        result->working_conference = fparse_long(fp);
        if ( fparse_string(fp, &result->what_am_i_doing) != OK )
        {
    	kom_log("fparse_who_info(): parse error.\n");
            err_stat = 30;
    	kom_errno = KOM_LDB_ERR;
    	return FAILURE;
        }
    
        return OK;
    }
    
        
    extern Success
    fparse_who_info_list(FILE *fp,
    		     Who_info_list *result)
    {
        int i;
        
        fskipwhite(fp);
    
        result->no_of_persons = fparse_long(fp);
        
        if ( result->no_of_persons > 0 )
        {
    	fskipwhite(fp);
    	switch(getc(fp))
    	{
    	case '{':
    	    result->info = REALLOC(result->info,
    				   (result->no_of_persons
    				    * sizeof(Who_info)));
    
    	    if ( result->info == NULL )
    	    {
                    err_stat = 0;
    		kom_errno = KOM_OUT_OF_MEMORY;
    		return FAILURE;
    	    }
    	    
    	    for ( i = 0; i < result->no_of_persons; i++)
    	    {
     		init_who_info(&result->info[ i ]);
    		if ( fparse_who_info(fp, &result->info[ i ]) != OK )
    		    return FAILURE;
    	    }
    	    
    	    
    	    fskipwhite(fp);
    	    if ( getc(fp) != '}' )
    	    {
    		kom_log("fparse_who_info_list(): expected '}' at pos %lu.\n",
    		    (unsigned long)ftell(fp));
                    err_stat = 31;
    		kom_errno = KOM_LDB_ERR;
    		return FAILURE;
    	    }
    	    
    	    break;
    
    	case '*':
    	    if ( result->info != NULL )
    	    {
    		sfree(result->info);
    		result->info = NULL;
    	    }
    	    break;
    
    	default:
    	    kom_log("fparse_who_info_list(): expected '*' or '{' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 32;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
        }
        else
        {
    	fskipwhite(fp);
    	if ( getc(fp) != '*' ) 
    	{
    	    kom_log("fparse_who_info_list(): expected '*' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 33;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
    	if ( result->info != NULL )
    	{
    	    sfree(result->info);
    	    result->info = NULL;
    	}
        }
        return OK;
    }
    
    
    extern Success
    fparse_aux_item_flags(FILE *fp,
                          Aux_item_flags *f)
    {
        fskipwhite(fp);
    
        f->deleted = getc(fp) != '0';
        f->inherit = getc(fp) != '0';
        f->secret = getc(fp) != '0';
        f->hide_creator = getc(fp) != '0';
        f->dont_garb = getc(fp) != '0';
        f->reserved3 = getc(fp) != '0';
        f->reserved4 = getc(fp) != '0';
        f->reserved5 = getc(fp) != '0';
    
        return OK;
    }
    
    extern Success
    fparse_aux_item_link(FILE *fp,
                         Aux_item_link *link)
    {
        /*
          FIXME: Omigawd this is ugly. Stupid compiler complains
          FIXME: about casting the result of an fparse_long
          FIXME: to an Object_type, but it won't complain if I cast
          FIXME: it to an int first.
        */
        link->target_type = (Object_type)(int)fparse_long(fp);
        link->target_item = fparse_long(fp);
        switch (link->target_type)
        {
        case CONF_OBJECT_TYPE:
            link->target_object.conf = (Conf_no)fparse_long(fp);
            break;
        case TEXT_OBJECT_TYPE:
            link->target_object.text = (Text_no)fparse_long(fp);
            break;
        default:
    	;
        }
    
        return OK;
    }
    
    extern Success
    fparse_aux_item(FILE *fp,
                    Aux_item *item)
    {
        item->aux_no = fparse_long(fp);
        item->tag = fparse_long(fp);
        item->creator = fparse_long(fp);
        item->sent_at = fparse_time(fp);
        fparse_aux_item_flags(fp, &item->flags);
        item->inherit_limit = fparse_long(fp);
        item->data = EMPTY_STRING;
        if (fparse_string(fp, &item->data) != OK)
        {
    	kom_log("fparse_aux_item(): Can't parse name.\n");
    	return FAILURE;
        }
    
        if (fparse_aux_item_link(fp, &(item->linked_item)) != OK)
        {
    	kom_log("fparse_aux_item(): Can't parse link.\n");
    	return FAILURE;
        }
    
        return OK;
    }
    
    extern Success
    fparse_aux_item_list(FILE *fp,
    		     Aux_item_list *result)
    {
        int c, i;
    
        result->items = NULL;
        result->length = fparse_long(fp);
    
        if ( fparse_long_errors != 0 )
        {
    	kom_log("%s(): %d fparse_long_errors before 'aux_items'. Reset.\n",
    	    "fparse_text_stat",
    	    fparse_long_errors);
    	fparse_long_errors = 0;
    	return FAILURE;
        }
    
        if ( result->length > 0 )
        {
    	fskipwhite(fp);
    	switch( c = getc(fp) )
    	{
    	case '{':
    	    result->items = 
    	      REALLOC(result->items,
    		      (result->length * sizeof(Aux_item)));
    
    	    if ( result->items == NULL )
    	    {
                    err_stat = 0;
    		kom_errno = KOM_OUT_OF_MEMORY;
    		return FAILURE;
    	    }
    	    
    	    for (i = 0; i < result->length; i++)
    		if ( fparse_aux_item(fp, &result->items[ i ]) != OK )
    		    return FAILURE;
    	    
    	    fskipwhite(fp);
    	    if ( (c = getc(fp)) != '}' )
    	    {
                    kom_log("fparse_aux_item_list(): expected '}' at pos %lu.\n",
                        (unsigned long)ftell(fp));
                    err_stat = 34;
                    kom_errno = KOM_LDB_ERR;
                    return FAILURE;
    	    }
    
    	    break;
    
    	case '*':
    	    if ( result->items != NULL )
    	    {
    		sfree(result->items);
    		result->items = NULL;
    		result->length = 0;
    	    }
    	    break;
    
    	default:
    	    kom_log("fparse_aux_item_list(): expected '*' or '}' at pos %lu.\n",
    		(unsigned long)ftell(fp));
                err_stat = 35;
    	    kom_errno = KOM_LDB_ERR;
    	    return FAILURE;
    	}
        }
        else
        {
    	fskipwhite(fp);
    	if ( (c = getc(fp)) != '*' ) 
    	{
                kom_log("fparse_aux_item_list(): expected '*' at pos %lu.\n",
                    (unsigned long)ftell(fp));
                err_stat = 36;
                kom_errno = KOM_LDB_ERR;
                return FAILURE;
    	}
    
            result->items = NULL;
            result->length = 0;
        }
        return OK;
    }
    
    
    extern Success
    fparse_misc_info(FILE *fp, 
    		 Misc_info *result)
    {
        long typ;
    
        typ = fparse_long(fp);
        
        switch(typ)
        {
        case recpt:
    	result->datum.recipient = fparse_long(fp);
    	break;
    	
        case cc_recpt:
    	result->datum.cc_recipient = fparse_long(fp);
    	break;
    	
        case bcc_recpt:
    	result->datum.bcc_recipient = fparse_long(fp);
    	break;
    	
        case loc_no:
    	result->datum.local_no = fparse_long(fp);
    	break;
    	
        case rec_time:
    	result->datum.received_at = fparse_time(fp);
    	break;
    	
        case comm_to:
    	result->datum.comment_to = fparse_long(fp);
    	break;
    	
        case comm_in:
    	result->datum.commented_in = fparse_long(fp);
    	break;
    	
        case footn_to:
    	result->datum.footnote_to = fparse_long(fp);
    	break;
    	
        case footn_in:
    	result->datum.footnoted_in = fparse_long(fp);
    	break;
    	
        case sent_by:
    	result->datum.sender = fparse_long(fp);
    	break;
    	
        case sent_at:
    	result->datum.sent_at = fparse_time(fp);
    	break;
    
        default:
    	kom_log("fparse_misc_info(): illegal info_type %d at pos %lu.\n",
    	    result->type, (unsigned long)ftell(fp));
            err_stat = 37;
    	kom_errno = KOM_LDB_ERR;
    	return FAILURE;
        }
    
        result->type = (Info_type)typ;
    
        return OK;
    }