/* Copyright 1989-93 GROUPE BULL -- See license conditions in file COPYRIGHT */
/***********************\
* 		        *
*  KlO  String  *
*  DEFINITIONS	        *
* 		        *
\***********************/

#ifndef INCLUDE_Kl_STRING_H
#define INCLUDE_Kl_STRING_H

/* type */

/* the string field of a KlString begins at the same place as the KlAtom p_name
 * field, so that a KlAtom can be handled to any function expecting an KlString
 * as argument. An KlAtom is less memory_consuming for often used symbols (
 * "foo" "foo" allocates two strings, 'foo 'foo only one atom), but cannot be
 * released.
 */

typedef struct _KlString {
    KlKLONE_HEADER;
    char *string;
    unsigned int size;
}        *KlString;

typedef struct _KlStringPtr {
    KlKLONE_HEADER;
    char *string;
    unsigned int size;
    KlO refersto;			/* can be 0 */
}        *KlStringPtr;			/* same but do not free string! */


/* an internally used object for C typing, not a visible Klone type */
typedef struct _KlUString {
    KlKLONE_HEADER;
    unsigned char *string;
    unsigned int size;
}        *KlUString;

/* exported functions */

EXT KlString KlStringMake();
EXT KlString KlStringMakeNoCopy();
EXT KlString KlStringNMake();
EXT KlString KlStringMakeFromBytes();
EXT KlO KlStringPrint();
EXT KlO KlStringEqual();
EXT KlO KlStringNth();
EXT KlO add_strings();
EXT KlString KlStringMatch();
EXT KlString KlStringStrcat();
extern char *KlStripString();
extern KlO KlStringCoerce();
extern KlString KlExpandTildeForFiles();
extern char *KlStrdup();
extern KlString KlExpandTildeForFiles();
extern KlStringPtr KlStringPtrMake();
extern KlStringPtr KlStringPtrMakeAndRefers();

/* exported objects */

EXT KlString KlNilString;
EXT KlString KlPackage;

/* methods */

EXT KlType KlStringType;
EXT KlType KlStringPtrType;

/* macros */

#define KlIsAString(obj) KlHasTrait(obj, KlTrait_string)
#define KlMustBeString(o, n) KlArgumentMustHaveTrait(o, n, KlTrait_string)
#define KlConvertArgToString(o, n) (KlString) (KlIsAString(o) ? ((KlO) (o)) : \
    ((KlConvertArgTo_obj = KlCoerceOrNil(o, KlStringType)) ? \
     KlConvertArgTo_obj : KlBadArgument(o, n, KlTypeCName(KlStringType))))

/* atoms cannot be modified in place */
#define KlIsAModifiableString(obj) (KlIsAString(obj) && !KlIsASymbol(obj))
#define KlMustBeAModifiableString(obj, pos) \
    if (!KlIsAModifiableString(obj))  \
        KlBadArgument(obj, pos, KlTypeCName(KlStringType))

#define KlStringLength(obj) (KlIsASymbol(obj) ? \
    strlen(((KlString)(obj))->string) : (((KlString)(obj))->size))
#define KlStringSetLength(obj, l) {if(!KlIsASymbol(obj)) \
    (((KlString)(obj))->size) = l;}
#define KlStringFixLength(obj) {if(!KlIsASymbol(obj)) \
    ((KlString)(obj))->size = strlen(((KlString)(obj))->string);}

/* when we are sure these can only be modifiable strings */
#define KlModStringLength(obj) ((KlString)(obj))->size
#define KlModStringSetLength(obj, l) ((((KlString)(obj))->size) = (l))
#define KlModStringFixLength(obj) \
    (((KlString)(obj))->size = strlen(((KlString)(obj))->string))


#endif					/* INCLUDE_Kl_STRING_H */


syntax highlighted by Code2HTML, v. 0.9.1