1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
@@
identifier usb;
@@
<ooo
usb_register(&usb)
ooo
usb_deregister(&usb)
ooo>
@@
local function probe_fn;
local function disconnect_fn;
int minor;
@@
struct usb_driver usb = {
ooo
probe: probe_fn,
ooo
disconnect: disconnect_fn,
ooo
minor: minor,
ooo
};
@@
int minor_offset;
expression E1, E2, E3, E4, E5, E6;
type T;
T moe;
identifier field;
identifier v;
expression L1, L2, L3, L;
statement loop_body;
@@
(
probe_fn(...) {
...
int v;
... WHEN != v = L
+ if (usb_register_dev(&usb, 1, &v)) {
while(L1) {
<...
v = L2;
...>
}
+ }
... WHEN != v = L
! moe.field = v;
... WHEN != v = L
devfs_register(E1, E2, E3, USB_MAJOR, minor + moe.field, E4, E5, E6)
... WHEN != v = L
}
|
probe_fn(...) {
...
int v;
... WHEN != v = L
+ if (usb_register_dev(&usb, 1, &v)) {
while(L1) {
<...
v = L2;
...>
}
+ }
... WHEN != v = L
(
! moe.field = v;
ooo WHEN != v = L
devfs_register(E1, E2, E3, USB_MAJOR, minor + v, E4, E5, E6)
)
... WHEN != v = L
}
|
probe_fn(...) {
... WHEN != moe.field = L
+ if (usb_register_dev(&usb, 1, &moe.field)) {
while(L1) {
<...
moe.field = L2;
...>
}
+ }
... WHEN != moe.field = L
devfs_register(E1, E2, E3, USB_MAJOR, minor + moe.field, E4, E5, E6)
... WHEN != moe.field = L
}
)
@@
T E;
identifier f;
@@
disconnect_fn(...) {
***
! devfs_unregister(E.f)
+ usb_deregister_dev(&usb, 1, E.field)
***
}
|