lkml.org 
[lkml]   [2012]   [Oct]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Subject[PATCH 0/11] introduce macros for i2c_msg initialization
    Date
    This patch set introduces some macros for describing how an i2c_msg is
    being initialized. There are three macros: I2C_MSG_READ, for a read
    message, I2C_MSG_WRITE, for a write message, and I2C_MSG_OP, for some other
    kind of message, which is expected to be very rarely used.

    Some i2c_msg initializations have been updated accordingly using the
    following semantic patch:

    // <smpl>
    @r@
    field list[n] ds;
    type T;
    identifier i;
    @@

    struct i2c_msg {
    ds
    T i;
    ...
    };

    @@
    initializer list[r.n] is;
    expression a;
    identifier nm;
    identifier r.i;
    @@

    struct i2c_msg nm = {
    is,
    - a
    + .i = a
    ,...
    };

    @@
    initializer list[r.n] is;
    expression a;
    identifier nm;
    identifier r.i;
    @@

    struct i2c_msg nm[...] = { ..., {
    is,
    - a
    + .i = a
    ,...}, ...};

    @@
    initializer list[r.n] is;
    expression a;
    identifier nm;
    identifier r.i;
    @@

    struct i2c_msg nm[] = { ..., {
    is,
    - a
    + .i = a
    ,...}, ...};

    // --------------------------------------------------------------------
    // ensure everyone has all fields, pointer case first

    @rt@
    type T;
    identifier i;
    @@

    struct i2c_msg {
    ...
    T *i;
    ...
    };

    @t1@
    expression e;
    identifier nm,rt.i;
    position p;
    @@

    struct i2c_msg nm = {@p
    .i = e,
    };

    @@
    identifier nm,rt.i;
    position p!= t1.p;
    @@

    struct i2c_msg nm = {@p
    + .i = NULL,
    ...
    };

    @t2@
    expression e;
    identifier nm,rt.i;
    position p;
    @@

    struct i2c_msg nm[] = { ..., {@p
    .i = e,
    }, ...};

    @@
    identifier nm,rt.i;
    position p!= t2.p;
    @@

    struct i2c_msg nm[] = { ..., {@p
    + .i = NULL,
    ...
    }, ...};

    @t3@
    expression e;
    identifier nm,rt.i;
    position p;
    @@

    struct i2c_msg nm[...] = { ..., {@p
    .i = e,
    }, ...};

    @@
    identifier nm,rt.i;
    position p!= t3.p;
    @@

    struct i2c_msg nm[...] = { ..., {@p
    + .i = NULL,
    ...
    }, ...};

    // ---------------------------------

    @f1@
    expression e;
    identifier nm,r.i;
    position p;
    @@

    struct i2c_msg nm = {@p
    .i = e,
    };

    @@
    identifier nm,r.i;
    position p!= f1.p;
    @@

    struct i2c_msg nm = {@p
    + .i = 0,
    ...
    };

    @f2@
    expression e;
    identifier nm,r.i;
    position p;
    @@

    struct i2c_msg nm[] = { ..., {@p
    .i = e,
    }, ...};

    @@
    identifier nm,r.i;
    position p!= f2.p;
    @@

    struct i2c_msg nm[] = { ..., {@p
    + .i = 0,
    ...
    }, ...};

    @f3@
    expression e;
    identifier nm,r.i;
    position p;
    @@

    struct i2c_msg nm[...] = { ..., {@p
    .i = e,
    }, ...};

    @@
    identifier nm,r.i;
    position p!= f3.p;
    @@

    struct i2c_msg nm[...] = { ..., {@p
    + .i = 0,
    ...
    }, ...};

    // --------------------------------------------------------------------

    @@
    constant c;
    identifier x;
    type T,T1;
    T[] b;
    @@

    struct i2c_msg x =
    { .buf = \((T1)b\|(T1)(&b)\|(T1)(&b[0])\), .len =
    (
    0
    |
    sizeof (...)
    |
    - c
    + sizeof(b)
    )
    };

    @@
    constant c;
    identifier x;
    type T,T1;
    T[] b;
    @@

    struct i2c_msg x[...] = {...,
    { .buf = \((T1)b\|(T1)(&b)\|(T1)(&b[0])\), .len =
    (
    0
    |
    sizeof (...)
    |
    - c
    + sizeof(b)
    )
    } ,...};

    @@
    constant c;
    identifier x;
    type T,T1;
    T[] b;
    @@

    struct i2c_msg x[] = {...,
    { .buf = \((T1)b\|(T1)(&b)\|(T1)(&b[0])\), .len =
    (
    0
    |
    sizeof (...)
    |
    - c
    + sizeof(b)
    )
    } ,...};

    @@
    constant c;
    identifier x;
    type T1;
    expression b;
    @@

    struct i2c_msg x =
    { .buf = (T1)(&b), .len =
    (
    0
    |
    sizeof (...)
    |
    - c
    + sizeof(b)
    )
    };

    @@
    constant c;
    identifier x;
    type T1;
    expression b;
    @@

    struct i2c_msg x[...] = {...,
    { .buf = (T1)(&b), .len =
    (
    0
    |
    sizeof (...)
    |
    - c
    + sizeof(b)
    )
    } ,...};

    @@
    constant c;
    identifier x;
    type T1;
    expression b;
    @@

    struct i2c_msg x[] = {...,
    { .buf = (T1)(&b), .len =
    (
    0
    |
    sizeof (...)
    |
    - c
    + sizeof(b)
    )
    } ,...};

    // --------------------------------------------------------------------

    @@
    expression a,b,c;
    identifier x;
    @@

    struct i2c_msg x =
    - {.addr = a, .buf = b, .len = c, .flags = I2C_M_RD}
    + I2C_MSG_READ(a,b,c)
    ;

    @@
    expression a,b,c;
    identifier x;
    @@

    struct i2c_msg x =
    - {.addr = a, .buf = b, .len = c, .flags = 0}
    + I2C_MSG_WRITE(a,b,c)
    ;

    // has to come before the next rule, which matcher fewer fields
    @@
    expression a,b,c,d;
    identifier x;
    @@

    struct i2c_msg x =
    - {.addr = a, .buf = b, .len = c, .flags = d}
    + I2C_MSG_OP(a,b,c,d)
    ;

    // --------------------------------------------------------------------

    @@
    expression a,b,c;
    identifier x;
    @@

    struct i2c_msg x[] = {...,
    - {.addr = a, .buf = b, .len = c, .flags = I2C_M_RD}
    + I2C_MSG_READ(a,b,c)
    ,...};

    @@
    expression a,b,c;
    identifier x;
    @@

    struct i2c_msg x[] = {...,
    - {.addr = a, .buf = b, .len = c, .flags = 0}
    + I2C_MSG_WRITE(a,b,c)
    ,...};

    @@
    expression a,b,c,d;
    identifier x;
    @@

    struct i2c_msg x[] = {...,
    - {.addr = a, .buf = b, .len = c, .flags = d}
    + I2C_MSG_OP(a,b,c,d)
    ,...};

    // --------------------------------------------------------------------

    @@
    expression a,b,c;
    identifier x;
    @@

    struct i2c_msg x[...] = {...,
    - {.addr = a, .buf = b, .len = c, .flags = I2C_M_RD}
    + I2C_MSG_READ(a,b,c)
    ,...};

    @@
    expression a,b,c;
    identifier x;
    @@

    struct i2c_msg x[...] = {...,
    - {.addr = a, .buf = b, .len = c, .flags = 0}
    + I2C_MSG_WRITE(a,b,c)
    ,...};

    @@
    expression a,b,c,d;
    identifier x;
    @@

    struct i2c_msg x[...] = {...,
    - {.addr = a, .buf = b, .len = c, .flags = d}
    + I2C_MSG_OP(a,b,c,d)
    ,...};

    // --------------------------------------------------------------------
    // got everything?

    @check1@
    identifier nm;
    position p;
    @@

    struct i2c_msg nm@p = {...};

    @script:python@
    p << check1.p;
    @@

    cocci.print_main("",p)

    @check2@
    identifier nm;
    position p;
    @@

    struct i2c_msg nm@p [] = {...,{...},...};

    @script:python@
    p << check2.p;
    @@

    cocci.print_main("",p)

    @check3@
    identifier nm;
    position p;
    @@

    struct i2c_msg nm@p [...] = {...,{...},...};

    @script:python@
    p << check3.p;
    @@

    cocci.print_main("",p)
    // </smpl>




    \
     
     \ /
      Last update: 2012-10-07 18:21    [W:9.814 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site