(* --------------------------------------------------------------------- *)
(* Modified code *)
-type added_string = Noindent of string | Indent of string
+type added_string = Noindent of string | Indent of string | Space of string
type info = { line : int; column : int;
strbef : (added_string * int (* line *) * int (* col *)) list;
(* the following is for or expressions *)
pos_info : meta_name mcode option; (* pos info, try not to duplicate *)
true_if_test_exp : bool;(* true if "test_exp from iso", only for exprs *)
+ (* the following is only for declarations *)
+ safe_for_multi_decls : bool;
(* isos relevant to the term; ultimately only used for rule_elems *)
iso_info : (string*anything) list }
| BEFOREAFTER of 'a list list * 'a list list * count
| NOTHING
-and 'a mcode = 'a * info * mcodekind * meta_pos (* pos variable *)
+and 'a replacement = REPLACEMENT of 'a list list * count | NOREPLACEMENT
+
+and 'a mcode = 'a * info * mcodekind * meta_pos list (* pos variables *)
(* pos is an offset indicating where in the C code the mcodekind
has an effect *)
(* int list is the match instances, which are only meaningful in annotated
C code *)
- (* int is the adjacency index, which is incremented on context dots *)
-(* iteration is only allowed on contect code, the intuition vaguely being
+ (* adjacency is the adjacency index, which is incremented on context dots *)
+(* iteration is only allowed on context code, the intuition vaguely being
that there is no way to replace something more than once. Actually,
allowing iterated additions on minus code would cause problems with some
heuristics for adding braces, because one couldn't identify simple
on - code for the moment. Although it may be confusing that there can be
iterated addition of code before context code where the context code is
immediately followed by removed code. *)
+and adjacency = ALLMINUS | ADJ of int
and mcodekind =
- MINUS of pos * int list * int * anything list list
+ MINUS of pos * int list * adjacency * anything replacement
| CONTEXT of pos * anything befaft
| PLUS of count
and count = ONE (* + *) | MANY (* ++ *)
and arity = UNIQUE | OPT | MULTI | NONE
and metavar =
- MetaIdDecl of arity * meta_name (* name *)
+ MetaMetaDecl of arity * meta_name (* name *)
+ | MetaIdDecl of arity * meta_name (* name *)
| MetaFreshIdDecl of meta_name (* name *) * seed (* seed *)
| MetaTypeDecl of arity * meta_name (* name *)
| MetaInitDecl of arity * meta_name (* name *)
+ | MetaInitListDecl of arity * meta_name (* name *) * list_len (*len*)
| MetaListlenDecl of meta_name (* name *)
| MetaParamDecl of arity * meta_name (* name *)
| MetaParamListDecl of arity * meta_name (*name*) * list_len (*len*)
| MetaExpListDecl of arity * meta_name (*name*) * list_len (*len*)
| MetaDeclDecl of arity * meta_name (* name *)
| MetaFieldDecl of arity * meta_name (* name *)
+ | MetaFieldListDecl of arity * meta_name (* name *) * list_len (*len*)
| MetaStmDecl of arity * meta_name (* name *)
| MetaStmListDecl of arity * meta_name (* name *)
| MetaFuncDecl of arity * meta_name (* name *)
| MetaFunc of meta_name mcode * idconstraint * keep_binding * inherited
| MetaLocalFunc of meta_name mcode * idconstraint * keep_binding * inherited
+ | DisjId of ident list
| OptIdent of ident
| UniqueIdent of ident
| CstListLen of int
| AnyListLen
-and unaryOp = GetRef | DeRef | UnPlus | UnMinus | Tilde | Not
+and unaryOp = GetRef | GetRefLabel | DeRef | UnPlus | UnMinus | Tilde | Not
and assignOp = SimpleAssign | OpAssign of arithOp
and fixOp = Dec | Inc
and typeC = base_typeC wrap
and baseType = VoidType | CharType | ShortType | IntType | DoubleType
- | FloatType | LongType | LongLongType
+ | FloatType | LongType | LongLongType | SizeType | SSizeType | PtrDiffType
and structUnion = Struct | Union
| MetaDecl of meta_name mcode * keep_binding * inherited
| MetaField of meta_name mcode * keep_binding * inherited
+ | MetaFieldList of meta_name mcode * listlen * keep_binding * inherited
| OptDecl of declaration
| UniqueDecl of declaration
and base_initialiser =
MetaInit of meta_name mcode * keep_binding * inherited
+ | MetaInitList of meta_name mcode * listlen * keep_binding * inherited
| InitExpr of expression
| ArInitList of string mcode (*{*) * initialiser dots * string mcode (*}*)
| StrInitList of bool (* true if all are - *) *
and meta_pos =
MetaPos of meta_name mcode * meta_name list *
- meta_collect * keep_binding * inherited
- | NoMetaPos
+ meta_collect * keep_binding * inherited
(* --------------------------------------------------------------------- *)
(* Function declaration *)
| SeqStart of string mcode (* { *)
| SeqEnd of string mcode (* } *)
- | ExprStatement of expression * string mcode (*;*)
+ | ExprStatement of expression option * string mcode (*;*)
| IfHeader of string mcode (* if *) * string mcode (* ( *) *
expression * string mcode (* ) *)
| Else of string mcode (* else *)
| Ty of fullType (* only at SP top level, matches a subterm *)
| TopInit of initialiser (* only at top level *)
| Include of string mcode (*#include*) * inc_file mcode (*file *)
+ | Undef of string mcode (* #define *) * ident (* name *)
| DefineHeader of string mcode (* #define *) * ident (* name *) *
define_parameters (*params*)
| Case of string mcode (* case *) * expression * string mcode (*:*)
| IncDots
and base_top_level =
- DECL of statement
+ NONDECL of statement
| CODE of statement dots
| FILEINFO of string mcode (* old file *) * string mcode (* new file *)
| ERRORWORDS of expression list
let set_dots_bef_aft d x = {x with bef_aft = d}
let get_pos x = x.pos_info
let set_pos x pos = {x with pos_info = pos}
-let get_test_exp x = x.true_if_test_exp
-let set_test_exp x = {x with true_if_test_exp = true}
+let get_test_exp x = x.true_if_test_exp
+let set_test_exp x = {x with true_if_test_exp = true}
+let get_safe_decl x = x.safe_for_multi_decls
let get_isos x = x.iso_info
let set_isos x isos = {x with iso_info = isos}
let get_pos_var (_,_,_,p) = p
let set_pos_var vr (a,b,c,_) = (a,b,c,vr)
-let drop_pos (a,b,c,_) = (a,b,c,NoMetaPos)
+let drop_pos (a,b,c,_) = (a,b,c,[])
let get_wcfvs (whencode : ('a wrap, 'b wrap) whencode list) =
Common.union_all
(* --------------------------------------------------------------------- *)
let get_meta_name = function
- MetaIdDecl(ar,nm) -> nm
+ MetaMetaDecl(ar,nm) -> nm
+ | MetaIdDecl(ar,nm) -> nm
| MetaFreshIdDecl(nm,seed) -> nm
| MetaTypeDecl(ar,nm) -> nm
| MetaInitDecl(ar,nm) -> nm
+ | MetaInitListDecl(ar,nm,nm1) -> nm
| MetaListlenDecl(nm) -> nm
| MetaParamDecl(ar,nm) -> nm
| MetaParamListDecl(ar,nm,nm1) -> nm
| MetaExpListDecl(ar,nm,nm1) -> nm
| MetaDeclDecl(ar,nm) -> nm
| MetaFieldDecl(ar,nm) -> nm
+ | MetaFieldListDecl(ar,nm,nm1) -> nm
| MetaStmDecl(ar,nm) -> nm
| MetaStmListDecl(ar,nm) -> nm
| MetaFuncDecl(ar,nm) -> nm
bef_aft = NoDots;
pos_info = None;
true_if_test_exp = false;
+ safe_for_multi_decls = false;
iso_info = [] }
let make_meta_rule_elem s d (fvs,fresh,inh) =
let rule = "" in
{(make_term
- (MetaRuleElem(((rule,s),no_info,d,NoMetaPos),Type_cocci.Unitary,false)))
+ (MetaRuleElem(((rule,s),no_info,d,[]),Type_cocci.Unitary,false)))
with free_vars = fvs; fresh_vars = fresh; inherited = inh}
let make_meta_decl s d (fvs,fresh,inh) =
let rule = "" in
{(make_term
- (MetaDecl(((rule,s),no_info,d,NoMetaPos),Type_cocci.Unitary,false))) with
+ (MetaDecl(((rule,s),no_info,d,[]),Type_cocci.Unitary,false))) with
free_vars = fvs; fresh_vars = fresh; inherited = inh}
-let make_mcode x = (x,no_info,CONTEXT(NoPos,NOTHING),NoMetaPos)
+let make_mcode x = (x,no_info,CONTEXT(NoPos,NOTHING),[])
(* --------------------------------------------------------------------- *)