Changeset aa4df66e877563ecf9367188566252bf929b46f0

Show
Ignore:
Timestamp:
06/29/10 18:22:31 (4 years ago)
Author:
Theo Schlossnagle <jesus@omniti.com>
git-committer:
Theo Schlossnagle <jesus@omniti.com> 1277835751 +0000
git-parent:

[5d3fa1939f21990710f00ef4463a193cc1024f3f]

git-author:
Theo Schlossnagle <jesus@omniti.com> 1277835751 +0000
Message:

add XML manipulation to our lua toolchest, refs #295

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/modules/lua_noit.c

    r8d08f77 raa4df66  
    5252#include "noit_check.h" 
    5353#include "noit_check_tools.h" 
     54#include "noit_xml.h" 
    5455#include "utils/noit_log.h" 
    5556#include "utils/noit_str.h" 
     
    14021403  if(nodeptr != lua_touserdata(L, 1)) 
    14031404    luaL_error(L, "must be called as method"); 
     1405  if(lua_gettop(L) == 3 && lua_isstring(L,2)) { 
     1406    const char *attr = lua_tostring(L,2); 
     1407    if(lua_isnil(L,3)) 
     1408      xmlSetProp(*nodeptr, (xmlChar *)attr, NULL); 
     1409    else 
     1410      xmlSetProp(*nodeptr, (xmlChar *)attr, (xmlChar *)lua_tostring(L,3)); 
     1411    return 0; 
     1412  } 
    14041413  if(lua_gettop(L) == 2 && lua_isstring(L,2)) { 
    14051414    xmlChar *v; 
     
    14231432  if(nodeptr != lua_touserdata(L, 1)) 
    14241433    luaL_error(L, "must be called as method"); 
     1434  if(lua_gettop(L) == 2 && lua_isstring(L,2)) { 
     1435    const char *data = lua_tostring(L,2); 
     1436    xmlChar *enc = xmlEncodeEntitiesReentrant((*nodeptr)->doc, (xmlChar *)data); 
     1437    xmlNodeSetContent(*nodeptr, (xmlChar *)enc); 
     1438    return 0; 
     1439  } 
    14251440  if(lua_gettop(L) == 1) { 
    14261441    xmlChar *v; 
     
    14491464    return 1; 
    14501465  } 
     1466  return 0; 
     1467} 
     1468static int 
     1469noit_lua_xmlnode_addchild(lua_State *L) { 
     1470  xmlNodePtr *nodeptr; 
     1471  nodeptr = lua_touserdata(L, lua_upvalueindex(1)); 
     1472  if(nodeptr != lua_touserdata(L, 1)) 
     1473    luaL_error(L, "must be called as method"); 
     1474  if(lua_gettop(L) == 2 && lua_isstring(L,2)) { 
     1475    xmlNodePtr *newnodeptr; 
     1476    newnodeptr = (xmlNodePtr *)lua_newuserdata(L, sizeof(*nodeptr)); 
     1477    *newnodeptr = xmlNewChild(*nodeptr, NULL, 
     1478                              (xmlChar *)lua_tostring(L,2), NULL); 
     1479    luaL_getmetatable(L, "noit.xmlnode"); 
     1480    lua_setmetatable(L, -2); 
     1481    return 1; 
     1482  } 
     1483  luaL_error(L,"must be called with one argument"); 
    14511484  return 0; 
    14521485} 
     
    14651498  lua_setmetatable(L, -2); 
    14661499  lua_pushcclosure(L, noit_lua_xmlnode_next, 1); 
     1500  return 1; 
     1501} 
     1502static int 
     1503noit_lua_xml_tostring(lua_State *L) { 
     1504  int n; 
     1505  xmlDocPtr *docptr; 
     1506  char *xmlstring; 
     1507  n = lua_gettop(L); 
     1508  /* the first arg is implicitly self (it's a method) */ 
     1509  docptr = lua_touserdata(L, lua_upvalueindex(1)); 
     1510  if(docptr != lua_touserdata(L, 1)) 
     1511    luaL_error(L, "must be called as method"); 
     1512  if(n != 1) luaL_error(L, "expects no arguments, got %d", n - 1); 
     1513  xmlstring = noit_xmlSaveToBuffer(*docptr); 
     1514  lua_pushstring(L, xmlstring); 
     1515  free(xmlstring); 
    14671516  return 1; 
    14681517} 
     
    15111560      LUA_DISPATCH(attr, noit_lua_xmlnode_attr); 
    15121561      LUA_DISPATCH(attribute, noit_lua_xmlnode_attr); 
     1562      LUA_DISPATCH(addchild, noit_lua_xmlnode_addchild); 
    15131563      break; 
    15141564    case 'c': 
     
    15711621    case 'r': 
    15721622     LUA_DISPATCH(root, noit_lua_xml_docroot); 
     1623     break; 
     1624    case 't': 
     1625     LUA_DISPATCH(tostring, noit_lua_xml_tostring); 
    15731626     break; 
    15741627    case 'x':