Changeset 22

Show
Ignore:
Timestamp:
05/29/06 02:54:06 (6 years ago)
Author:
Gregor
Message:

test/*, scripts/*, bcd/libxml2/*: libxml2 bindings :)

bcd/gen/bcdgen.d: Better C support.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Makefile

    r13 r22  
    88fltk2exa: test/fltk2.d bcd/bind.d 
    99    sh test/fltk2.sh ${DMD} 
     10 
     11libxml2exa: test/libxml2.d bcd/bind.d 
     12    sh test/libxml2.sh ${DMD} 
     13     
  • trunk/bcd/gen/bcdgen.d

    r21 r22  
    157157char[] safeName(char[] name) 
    158158{ 
    159     if (name == "align" || 
     159    if (name == "alias" || 
     160        name == "align" || 
     161        name == "function" || 
     162        name == "in" || 
     163        name == "inout" || 
     164        name == "out" || 
    160165        name == "override" || 
     166        name == "scope" || 
    161167        name == "version") { 
    162168        return name ~ "_"; 
     
    166172 
    167173/** 
     174 * Return mangled unless it's not mangled 
     175 */ 
     176char *getMangled(xmlNode *node) 
     177{ 
     178    char *mangled = xmlGetProp(node, "mangled"); 
     179    if (!mangled) mangled = xmlGetProp(node, "name"); 
     180    return mangled; 
     181} 
     182 
     183/** 
     184 * Return demangled unless it's not mangled 
     185 */ 
     186char *getDemangled(xmlNode *node) 
     187{ 
     188    char *demangled = xmlGetProp(node, "demangled"); 
     189    if (!demangled) demangled = xmlGetProp(node, "name"); 
     190    return demangled; 
     191} 
     192 
     193/** 
    168194 * Do we need to parse this node? 
    169195 */ 
     
    172198    // only parse it if it's in the file we're parsing and it's demanglable 
    173199    char* file = xmlGetProp(node, "file"); 
    174     char* demangled = xmlGetProp(node, "demangled"); 
     200    char* demangled = getDemangled(node); 
    175201    char* incomplete = xmlGetProp(node, "incomplete"); 
    176202     
     
    356382{ 
    357383    char[] name = toString(xmlGetProp(node, "name")); 
    358     char[] mangled = toString(xmlGetProp(node, "mangled")); 
    359     char[] demangled = toString(xmlGetProp(node, "demangled")); 
     384    char[] mangled = toString(getMangled(node)); 
     385    char[] demangled = toString(getDemangled(node)); 
    360386     
    361387    // parse for base classes 
     
    401427{ 
    402428    char[] name = toString(xmlGetProp(node, "name")); 
    403     char[] mangled = toString(xmlGetProp(node, "mangled")); 
    404     char[] demangled = toString(xmlGetProp(node, "demangled")); 
     429    char[] mangled = toString(getMangled(node)); 
     430    char[] demangled = toString(getDemangled(node)); 
    405431     
    406432    dtail ~= "struct " ~ name ~ " {\n"; 
     
    420446    ParsedType type = parseType(stype, node.parent); 
    421447    char[] name = toString(xmlGetProp(node, "name")); 
    422     char[] mangled = toString(xmlGetProp(node, "mangled")); 
     448    char[] mangled = toString(getMangled(node)); 
    423449     
    424450    if (outputC) { 
     
    458484            cout ~= "}\n"; 
    459485        } else { 
    460             char[] demangled = toString(xmlGetProp(node, "demangled")); 
     486            char[] demangled = toString(getDemangled(node)); 
    461487         
    462488            // if it's a const, don't make the set 
     
    511537                char[] aname = toString(xmlGetProp(curNode, "name")); 
    512538                if (aname == "") aname = "_" ~ toString(onParam); 
     539                aname = safeName(aname); 
    513540                 
    514541                if (Dargs != "") { 
     
    575602                         char[] Dargs, char[] Deargs, char[] Cargs, char[] Dcall, char[] Ccall) 
    576603{ 
     604    if (outputC) { 
     605        dhead ~= "extern (C) " ~ type.DType ~ " " ~ demangled ~ "(" ~ Deargs ~ ");\n"; 
     606        return; 
     607    } 
     608     
    577609    dhead ~= "extern (C) " ~ type.DType ~ " _BCD_" ~ mangled ~ "(" ~ Deargs ~ ");\n"; 
    578610     
     
    612644{ 
    613645    char[] name = toString(xmlGetProp(node, "name")); 
    614     char[] mangled = toString(xmlGetProp(node, "mangled")); 
     646    char[] mangled = toString(getMangled(node)); 
    615647    ParsedType type = parseType(toString(xmlGetProp(node, "returns")), 
    616648                                node.parent); 
     
    632664{ 
    633665    char[] name = toString(xmlGetProp(node, "name")); 
    634     char[] mangled = toString(xmlGetProp(node, "mangled")); 
    635     char[] demangled = toString(xmlGetProp(node, "demangled")); 
     666    char[] mangled = toString(getMangled(node)); 
     667    char[] demangled = toString(getDemangled(node)); 
    636668    ParsedType type = parseType(toString(xmlGetProp(node, "returns")), 
    637669                                node.parent); 
     
    658690void parse_Constructor(xmlNode *node) 
    659691{ 
     692    if (outputC) return; // no constructors in C 
     693     
    660694    char[] name = toString(xmlGetProp(node, "name")); 
    661     char[] mangled = toString(xmlGetProp(node, "mangled")); 
     695    char[] mangled = toString(getMangled(node)); 
    662696     
    663697    while (find(mangled, "*INTERNAL*") != -1) { 
     
    846880                 
    847881            } else if (nname == "Struct" || nname == "Class") { 
    848                 ParsedType pt; 
    849                 char[] className = toString(xmlGetProp(curNode, "demangled")); 
    850                  
    851                 // can't have incomplete types in D, so call it a BoundClass in D 
    852                 if (xmlGetProp(curNode, "incomplete")) { 
    853                     pt = new ParsedType(className ~ " *", 
    854                                         "bcd.bind.BoundClass"); 
     882                char[] className = toString(getDemangled(curNode)); 
     883                 
     884                if (outputC) { 
     885                    if (xmlGetProp(curNode, "incomplete")) { 
     886                        return new ParsedType("struct " ~ className, 
     887                                              "void"); 
     888                    } else { 
     889                        return new ParsedType("struct " ~ className, 
     890                                              toString(xmlGetProp(curNode, "name"))); 
     891                    } 
    855892                } else { 
    856                     pt = new ParsedType(className ~ " *", 
    857                                         toString(xmlGetProp(curNode, "name"))); 
    858                 } 
    859                 if (outputC) pt.CType = "struct " ~ pt.CType; 
    860                 pt.className = className; 
    861                 pt.isClass = true; 
    862                 return pt; 
     893                    ParsedType pt; 
     894                     
     895                    // can't have incomplete types in D, so call it a BoundClass in D 
     896                    if (xmlGetProp(curNode, "incomplete")) { 
     897                        pt = new ParsedType(className ~ " *", 
     898                                            "bcd.bind.BoundClass"); 
     899                    } else { 
     900                        pt = new ParsedType(className ~ " *", 
     901                                            toString(xmlGetProp(curNode, "name"))); 
     902                    } 
     903                    pt.className = className; 
     904                    pt.isClass = true; 
     905                    return pt; 
     906                } 
    863907                 
    864908            } else if (nname == "CvQualifiedType") { 
     
    881925                     
    882926                    cout ~= "typedef " ~ pt.CType ~ " _BCD_" ~ aname ~ ";\n"; 
    883                     dhead ~= "alias " ~ pt.DType ~ " " ~ aname ~ ";\n"; 
    884                 } 
    885                  
    886                 ParsedType rpt = new ParsedType("_BCD_" ~ aname, aname); 
     927                     
     928                    if (files[toString(xmlGetProp(curNode, "file"))] == curFile) 
     929                        dhead ~= "alias " ~ pt.DType ~ " " ~ aname ~ ";\n"; 
     930                } 
     931                 
     932                ParsedType rpt = new ParsedType("_BCD_" ~ aname, pt.DType); 
    887933                rpt.isClass = pt.isClass; 
    888934                rpt.isFunction = pt.isFunction; 
     
    944990                            if (toString(xmlGetProp(pnode, "id")) == scontext) { 
    945991                                // FIXME: temporary kludge 
    946                                 char[] demangled = toString(xmlGetProp(pnode, "demangled")); 
     992                                char[] demangled = toString(getDemangled(curNode)); 
    947993                                if (demangled != "" && demangled != "::") 
    948994                                    return new ParsedType( 
    949                                         toString(xmlGetProp(pnode, "demangled")) ~ "::" ~ 
     995                                        toString(getDemangled(curNode)) ~ "::" ~ 
    950996                                        toString(xmlGetProp(curNode, "name")), "int"); 
    951997                            }