/*
*******************************************************************************
*
*   Copyright (C) 1998-1999, International Business Machines
*   Corporation and others.  All Rights Reserved.
*
*******************************************************************************
*
* File list.h
*
* Modification History:
*
*   Date        Name        Description
*   06/01/99    stephen     Creation.
*******************************************************************************
*/

#ifndef LIST_H
#define LIST_H 1

#include "unicode/utypes.h"

/* A string list */
struct SStringList {
  UChar **fData;
  int32_t fCount;
  int32_t fCapacity;
};

struct SList* strlist_open(UErrorCode *status);
void strlist_close(struct SList *list, UErrorCode *status);
void strlist_add(struct SList *list, const UChar *s, UErrorCode *status);

/* A two-dimensional string list */
struct SStringList2d {
  UChar **fData;
  int32_t fCount;
  int32_t fCapacity;
  
  int32_t *fRows;
  int32_t fRowCount;
  int32_t fRowCapacity;
};

struct SList* strlist2d_open(UErrorCode *status);
void strlist2d_close(struct SList *list, UErrorCode *status);
void strlist2d_newRow(struct SList *list, UErrorCode *status);
void strlist2d_add(struct SList *list, const UChar *s, UErrorCode *status);

/* A name/value pair for a tagged list */
struct SStringPair {
  UChar *fKey;
  UChar *fValue;
};

/* A tagged list */
struct STaggedList {
  struct SStringPair *fData;
  int32_t fCount;
  int32_t fCapacity;
};

struct SList* taglist_open(UErrorCode *status);
void taglist_close(struct SList *list, UErrorCode *status);
void taglist_add(struct SList *list, const UChar *tag, 
		 const UChar *data, UErrorCode *status);
const UChar* taglist_get(const struct SList *list, const UChar *tag, 
			 UErrorCode *status);

/* Types of lists */
enum EListType {
  eEmpty,
  eStringList,
  eStringList2d,
  eTaggedList
};

/* A generic list container */
struct SList {
  enum EListType fType; /* type of element in union */
  
  union {
    struct SStringList fStringList;
    struct SStringList2d fStringList2d;
    struct STaggedList fTaggedList;
  } u;
};

#endif
