/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Pix
*
* Copyright (C) 2003, 2010 Free Software Foundation, Inc.
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see .
*/
#ifndef ALBUMTHEME_PRIVATE_H
#define ALBUMTHEME_PRIVATE_H
#include
/* A list of GthTag elements that describes a parsed .gthtml file */
extern GList *yy_parsed_doc;
/* GthMem: the memory stack used to evaluate an expression. */
typedef struct {
int *data;
int top;
} GthMem;
GthMem* gth_mem_new (int size);
void gth_mem_free (GthMem *mem);
void gth_mem_set_empty (GthMem *mem);
gboolean gth_mem_is_empty (GthMem *mem);
void gth_mem_push (GthMem *mem,
int val);
int gth_mem_pop (GthMem *mem);
int gth_mem_get_pos (GthMem *mem,
int pos);
int gth_mem_get (GthMem *mem);
int gth_mem_get_top (GthMem *mem);
/* GthCell: contains an element of the expression, therefore a GthExpr is a
* series of GthCells. */
typedef enum {
GTH_OP_ADD,
GTH_OP_SUB,
GTH_OP_MUL,
GTH_OP_DIV,
GTH_OP_NEG,
GTH_OP_NOT,
GTH_OP_AND,
GTH_OP_OR,
GTH_OP_CMP_EQ,
GTH_OP_CMP_NE,
GTH_OP_CMP_LT,
GTH_OP_CMP_GT,
GTH_OP_CMP_LE,
GTH_OP_CMP_GE,
} GthOp;
typedef enum {
GTH_CELL_TYPE_OP,
GTH_CELL_TYPE_VAR,
GTH_CELL_TYPE_STRING,
GTH_CELL_TYPE_INTEGER
} GthCellType;
typedef struct {
int ref;
GthCellType type;
union {
GthOp op;
char *var;
GString *string;
int integer;
} value;
} GthCell;
GthCell* gth_cell_new (void);
GthCell* gth_cell_ref (GthCell *cell);
void gth_cell_unref (GthCell *cell);
/* GthExpr */
typedef struct _GthExpr GthExpr;
typedef int (*GthGetVarValueFunc) (GthExpr *expr,
int *index,
const char *var_name,
gpointer data);
struct _GthExpr {
int ref;
GthCell **data;
int top;
GthGetVarValueFunc get_var_value_func;
gpointer get_var_value_data;
};
GthExpr * gth_expr_new (void);
GthExpr * gth_expr_ref (GthExpr *e);
void gth_expr_unref (GthExpr *e);
void gth_expr_set_empty (GthExpr *e);
gboolean gth_expr_is_empty (GthExpr *e);
void gth_expr_push_expr (GthExpr *e,
GthExpr *e2);
void gth_expr_push_op (GthExpr *e,
GthOp op);
void gth_expr_push_var (GthExpr *e,
const char *name);
void gth_expr_push_string (GthExpr *e,
const char *value);
void gth_expr_push_integer (GthExpr *e,
int value);
void gth_expr_pop (GthExpr *e);
GthCell * gth_expr_get_pos (GthExpr *e,
int pos);
GthCell * gth_expr_get (GthExpr *e);
int gth_expr_get_top (GthExpr *e);
void gth_expr_set_get_var_value_func (GthExpr *e,
GthGetVarValueFunc f,
gpointer data);
void gth_expr_print (GthExpr *e);
int gth_expr_eval (GthExpr *e);
void gth_expr_list_unref (GList *list);
/* GthAttribute */
typedef enum {
GTH_ATTRIBUTE_EXPR,
GTH_ATTRIBUTE_STRING
} GthAttributeType;
typedef struct {
char *name;
GthAttributeType type;
union {
GthExpr *expr;
char *string;
} value;
} GthAttribute;
GthAttribute * gth_attribute_new_expression (const char *name,
GthExpr *expr);
GthAttribute * gth_attribute_new_string (const char *name,
const char *string);
void gth_attribute_free (GthAttribute *attribute);
/* GthCondition */
typedef struct {
GthExpr *expr;
GList *document; /* GthTag list */
} GthCondition;
GthCondition * gth_condition_new (GthExpr *expr);
void gth_condition_free (GthCondition *cond);
void gth_condition_add_document (GthCondition *cond,
GList *document);
/* GthLoop */
typedef enum {
GTH_TAG_HEADER = 0,
GTH_TAG_FOOTER,
GTH_TAG_LANGUAGE,
GTH_TAG_THEME_LINK,
GTH_TAG_IMAGE,
GTH_TAG_IMAGE_LINK,
GTH_TAG_IMAGE_IDX,
GTH_TAG_IMAGE_DIM,
GTH_TAG_IMAGE_ATTRIBUTE,
GTH_TAG_IMAGES,
GTH_TAG_FILE_NAME,
GTH_TAG_FILE_PATH,
GTH_TAG_FILE_SIZE,
GTH_TAG_PAGE_LINK,
GTH_TAG_PAGE_IDX,
GTH_TAG_PAGE_ROWS,
GTH_TAG_PAGE_COLS,
GTH_TAG_PAGES,
GTH_TAG_THUMBNAILS,
GTH_TAG_TIMESTAMP,
GTH_TAG_TRANSLATE,
GTH_TAG_HTML,
GTH_TAG_SET_VAR,
GTH_TAG_EVAL,
GTH_TAG_IF,
GTH_TAG_FOR_EACH_THUMBNAIL_CAPTION,
GTH_TAG_FOR_EACH_IMAGE_CAPTION,
GTH_TAG_FOR_EACH_IN_RANGE,
GTH_TAG_ITEM_ATTRIBUTE,
GTH_TAG_INVALID
} GthTagType;
typedef struct {
GthTagType type;
GList *document; /* GthTag list */
} GthLoop;
#define GTH_LOOP(x) ((GthLoop *)(x))
GthLoop * gth_loop_new (GthTagType loop_type);
void gth_loop_free (GthLoop *loop);
GthTagType gth_loop_get_type (GthLoop *loop);
void gth_loop_add_document (GthLoop *loop,
GList *document);
/* GthRangeLopp */
typedef struct {
GthLoop parent;
char *iterator;
GthExpr *first_value;
GthExpr *last_value;
} GthRangeLoop;
#define GTH_RANGE_LOOP(x) ((GthRangeLoop *)(x))
GthLoop * gth_range_loop_new (void);
void gth_range_loop_free (GthRangeLoop *loop);
void gth_range_loop_set_range (GthRangeLoop *loop,
const char *iterator,
GthExpr *first_value,
GthExpr *last_value);
/* GthTag */
typedef struct {
GthTagType type;
union {
GList *attributes; /* GthAttribute list */
char *html; /* html */
GList *cond_list; /* GthCondition list */
GthLoop *loop; /* a loop tag */
GthRangeLoop *range_loop;
} value;
GList *document; /* GthTag list */
} GthTag;
GthTag * gth_tag_new (GthTagType type,
GList *attributes);
GthTag * gth_tag_new_html (const char *html);
GthTag * gth_tag_new_condition (GList *cond_list);
GthTag * gth_tag_new_loop (GthLoop *loop);
void gth_tag_add_document (GthTag *tag,
GList *document);
void gth_tag_free (GthTag *tag);
GthTagType gth_tag_get_type_from_name (const char *tag_name);
const char * gth_tag_get_name_from_type (GthTagType tag_type);
/* Utils */
int gth_albumtheme_yyparse (void);
void gth_parsed_doc_print_tree (GList *document);
void gth_parsed_doc_free (GList *document);
#endif /* ALBUMTHEME_PRIVATE_H */