lkml.org 
[lkml]   [2014]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Subject[PATCH 0/20] fix misspelling of current function in string
    Date
    These patches replace what appears to be a reference to the name of the
    current function but is misspelled in some way by either the name of the
    function itself, or by %s and then __func__ in an argument list.

    // <smpl>
    // sudo apt-get install python-pip
    // sudo pip install python-Levenshtein
    // spatch requires the argument --in-place

    virtual after_start

    @initialize:ocaml@
    @@

    let extensible_functions = ref ([] : string list)
    let restarted = ref false

    let restart _ =
    restarted := true;
    let it = new iteration() in
    it#add_virtual_rule After_start;
    Printf.eprintf "restarting\n";
    it#register()

    @initialize:python@
    @@
    import re
    from Levenshtein import distance
    mindist = 1 // 1 to find only misspellings
    maxdist = 2
    ignore_leading = True

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

    @r0@
    constant char [] c;
    identifier f;
    @@

    f(...,c,...)

    @script:ocaml@
    c << r0.c;
    f << r0.f;
    @@

    (if not !restarted then restart());
    match Str.split_delim (Str.regexp "%") c with
    _::_::_ ->
    if not (List.mem f !extensible_functions)
    then extensible_functions := f :: !extensible_functions
    | _ -> ()

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

    @r depends on after_start@
    constant char [] c;
    position p;
    identifier f;
    @@

    f(...,c@p,...)

    @script:python flt@
    c << r.c;
    p << r.p;
    matched;
    @@

    func = p[0].current_element
    wpattern = "[a-zA-Z_][a-zA-Z0-9_]*"
    if ignore_leading:
    func = func.strip("_")
    wpattern = "[a-zA-Z][a-zA-Z0-9_]*"
    lf = len(func)
    cocci.include_match(False)
    // ignore extremely short function names
    if lf > 3:
    words = [w for w in re.findall(wpattern, c) if abs(len(w) - lf) <= maxdist]
    for w in words:
    d = distance(w, func)
    if mindist <= d and d <= maxdist:
    coccinelle.matched = w
    cocci.include_match(True)
    //print "%s:%d:%s():%d: %s" % (p[0].file, int(p[0].line), func, d, c)
    break

    @script:ocaml r2@
    c << r.c;
    f << r.f;
    matched << flt.matched;
    fixed;
    @@

    let pieces = Str.split_delim (Str.regexp_string matched) c in
    match pieces with
    [before;after] ->
    let preceeding =
    List.length(Str.split (Str.regexp_string "%") before) > 1 in
    if preceeding
    then Coccilib.include_match false
    else
    if List.mem f !extensible_functions
    then fixed := before ^ "%s" ^ after
    else Coccilib.include_match false
    | _ -> Coccilib.include_match false

    @changed1@
    constant char [] r.c;
    identifier r2.fixed;
    position r.p;
    identifier r.f;
    @@

    f(...,
    -c@p
    +fixed,__func__
    ,...)

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

    @s depends on after_start@
    constant char [] c;
    position p;
    identifier f;
    @@

    f(...,c@p,...)

    @script:python flt2@
    c << s.c;
    p << s.p;
    matched;
    @@

    func = p[0].current_element
    wpattern = "[a-zA-Z_][a-zA-Z0-9_]*"
    if ignore_leading:
    func = func.strip("_")
    wpattern = "[a-zA-Z][a-zA-Z0-9_]*"
    lf = len(func)
    cocci.include_match(False)
    // ignore extremely short function names
    if lf > 3:
    words = [w for w in re.findall(wpattern, c) if abs(len(w) - lf) <= maxdist]
    for w in words:
    d = distance(w, func)
    if mindist <= d and d <= maxdist:
    coccinelle.matched = w
    cocci.include_match(True)
    //print "%s:%d:%s():%d: %s" % (p[0].file, int(p[0].line), func, d, c)
    break

    @script:ocaml s2@
    c << s.c;
    f << s.f;
    p << s.p;
    matched << flt2.matched;
    fixed;
    @@

    let ce = (List.hd p).current_element in
    let pieces = Str.split_delim (Str.regexp_string matched) c in
    match pieces with
    [before;after] ->
    let preceeding =
    List.length(Str.split (Str.regexp_string "%") before) > 1 in
    if preceeding
    then Coccilib.include_match false
    else
    if List.mem f !extensible_functions
    then Coccilib.include_match false
    else fixed := before ^ ce ^ after
    | _ -> Coccilib.include_match false

    @changed2@
    constant char [] s.c;
    identifier s2.fixed;
    position s.p;
    identifier s.f;
    @@

    f(...,
    -c@p
    +fixed
    ,...)
    // </smpl>



    \
     
     \ /
      Last update: 2014-12-07 21:01    [W:4.576 / U:0.168 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site