/*
 * Copyright (c) 2005 - 2007, Nils R. Weller
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
#ifndef SUBEXPR_H
#define SUBEXPR_H

struct builtin;
struct icode_list;
struct token;
struct vreg;
struct ty_func;

struct var_access {
	struct icode_instr	*ii;
	struct var_access	*next;
	struct var_access	*prev;
};


struct fetch_data {
	int				type;
#define FETCH_STRUMEM	1
#define FETCH_CONSTANT	2
#define FETCH_VARIABLE	3
#define FETCH_ADDRESS	4
	struct decl		*dec;
	struct token	*constant;
};

struct store_data {
	int				type;
#define STORE_STRUMEM	1
#define STORE_CONSTANT	2	
#define STORE_VARIABLE	3
	struct reg		*fromreg;
	struct decl		*to_var;
};

struct fcall_data {
	struct builtin_data	*builtin;
	struct decl		*callto;
	struct vreg		*calltovr;
	struct expr		*args;
	struct ty_func		*functype;
	struct vreg		*lvalue;
	int			need_anon;
	int			nargs;
	int			was_just_declared;
};

struct comp_literal {
	struct initializer	*init;
	struct type		*struct_type;
};	
	

struct s_expr {
	struct s_expr		*next;
	struct icode_list	*code;
	struct type		*type;
	struct vreg		*load;
	struct vreg		*res;
	struct token		*load_token;
	struct expr		*is_expr;
	struct decl		*var_lvalue;
	struct token		*operators[128];
	struct token		*meat;
	struct token		*is_sizeof;

/* IMPORTANT: May not have same value as token.h macros ... */	
#define SIZEOF_EXPR 1000

	int			is_lvalue;
	int			only_load;
	int			extype;
	int			idiom;
#define IDIOM_STAR_INC		1 /*  *p++  */
#define IDIOM_STAR_DEC		2 /*  *p--  */
#define IDIOM_INC_STAR		3 /*  *++p  */
#define IDIOM_DEC_STAR		4 /*  *--p  */

#define IDIOM_PAR_STAR_INC	5 /* (*p)++ */
#define	IDIOM_PAR_INC_STAR	6 /* ++*p or ++(*p) */
#define IDIOM_PAR_STAR_DEC	7 /* (*p)-- */
#define IDIOM_PAR_DEC_STAR	8 /* --*p or --(*p) */ 

#define IDIOM_ADDR_OF_ELEM	10 /* &foo[bar] */

#define IDIOM_ADDR_OF_MEM	11 /* &foo.bar or &foo->bar */ 

};


struct s_expr *
get_sub_expr(struct token **tok, int delim, int delim2, int extype); 

struct vreg *
s_expr_to_icode(struct s_expr *s, struct vreg *lvalue,
	struct icode_list *il, int eval);

struct fcall_data *
alloc_fcall_data(void);

#endif



syntax highlighted by Code2HTML, v. 0.9.1