/*
 | each.h (12 May 1998)
 | by Paul Clifford (paul@plasma.demon.co.uk)
 */

#ifndef FIND_H
#define FIND_H


typedef struct expression expression;
typedef struct parse_ctx parse_ctx;
typedef struct dirscan_ctx dirscan_ctx;
typedef struct file_info file_info;
typedef struct dir_position dir_position;

struct expression {
    int (*evaluate)(const expression *, file_info *, const dir_position *);
    void (*finalise)(expression *);
    void *argv[3];
    union {
        int n;
        const char *s;
        expression *e;
    } args[3];
};

struct parse_ctx {
    int i;
    int argc;
    const char **argv;
    int level;
};

struct dirscan_ctx {
    const char *dir;
    int nleft;
    int offset;
    char buffer[1024];
    const char *ptr;
};

struct file_info {
    const int load_adr;
    const int exec_adr;
    const int length;
    const int attributes;
    const int type;
    int prune; /* in place of the system internal name */
    const char time[5];
    const char name[1];
};

struct dir_position {
    const char *base;
    int base_strlen;
    char *path;
};

/* functions defined in asmcode.s */
extern int dirscan_do(dirscan_ctx *);
extern int substitute_args(const char *, char *, const int, const char *, const int);
extern int convert_filetype(const char *, int *);
extern int read_datestamp(int *, int *, const char *);
extern int compare_datestamp(const int, const int, const int, const int);
extern int extract_day(const int, const int, int *, int *);
extern int get_previous_day(const int, int *, int *);
extern char read_character(void);

/* functions defined in primaries.c */
extern expression *parse_primary(const char *, parse_ctx *);


#endif
