// Copyright: (C) 2009 Gilles Muller, Julia Lawall, INRIA, DIKU.  GPLv2.

@r exists@
local idexpression x;
statement S,S1;
position p1,p2,p3;
expression E,E1,E2;
type T,T1,T2;
expression *ptr != NULL;
@@

(
 if ((x@p1 = pci_get_device(...)) == NULL) S
|
 x@p1 = pci_get_device(...);
)
 ... when != pci_dev_put(...,(T)x,...)
     when != if (...) { <+... pci_dev_put(...,(T)x,...) ...+> }
     when != true x == NULL || ...
     when != x = E
     when != E = (T)x
     when any
(
 if (x == NULL || ...) S1
|
 if@p2 (...) {
  ... when != pci_dev_put(...,(T1)x,...)
      when != if (...) { <+... pci_dev_put(...,(T1)x,...) ...+> }
      when != x = E1
      when != E1 = (T1)x
(
  return \(0\|<+...x...+>\|ptr\);
|
  return@p3 ...;
)
}
)
... when != x = E2
pci_dev_put(...,(T2)x,...)

@ script:python @
p1 << r.p1;
p2 << r.p2;
p3 << r.p3;
@@

print "* TODO [[view:%s::face=ovl-face1::linb=%s::colb=%s::cole=%s][%s::%s]]" % (p1[0].file,p1[0].line,p1[0].column,p1[0].column_end,p1[0].file,p1[0].line)
for i in p2:
        print "[[view:%s::face=ovl-face3::linb=%s::colb=%s::cole=%s][if::%s]]" % (i.file,i.line,i.column,i.column_end,i.line)
for i in p3:
        print "[[view:%s::face=ovl-face2::linb=%s::colb=%s::cole=%s][return::%s]]" % (i.file,i.line,i.column,i.column_end,i.line)
cocci.include_match(False)