richter 00/05/26 16:31:11
Modified: . Tag: Embperl2 Embperl.xs epcomp.c epdom.c epdom.h
Embperl Tag: Embperl2 Syntax.pm
Log:
- Embperl 2
Revision Changes Path
No revision
No revision
1.26.2.10 +39 -3 embperl/Embperl.xs
Index: Embperl.xs
===================================================================
RCS file: /home/cvs/embperl/Embperl.xs,v
retrieving revision 1.26.2.9
retrieving revision 1.26.2.10
diff -u -r1.26.2.9 -r1.26.2.10
--- Embperl.xs 2000/05/24 14:33:25 1.26.2.9
+++ Embperl.xs 2000/05/26 23:31:03 1.26.2.10
@@ -628,7 +628,7 @@
MODULE = HTML::Embperl PACKAGE = XML::Embperl::DOM PREFIX = embperl_
-void
+SV *
embperl_Node_replaceChildWithCDATA (xDomTree, xOldChild,sText)
int xDomTree
int xOldChild
@@ -639,9 +639,12 @@
Node_replaceChildWithCDATA (DomTree_self(xDomTree), -1, xOldChild, s, l,
(pCurrReq -> nCurrEscMode & 3)== 3?1 + (pCurrReq -> nCurrEscMode & 4):pCurrReq ->
nCurrEscMode, nflgModified | nflgReturn) ;
pCurrReq -> nCurrEscMode = pCurrReq -> nEscMode ;
pCurrReq -> bEscModeSet = -1 ;
-
+ SvREFCNT_inc (sText) ;
+ RETVAL = sText ;
+OUTPUT:
+ RETVAL
-void
+SV *
embperl_Node_replaceChildWithUrlDATA (xDomTree, xOldChild,sText)
int xDomTree
int xOldChild
@@ -686,6 +689,10 @@
pCurrReq -> nCurrEscMode = pCurrReq -> nEscMode ;
pCurrReq -> bEscModeSet = -1 ;
+ SvREFCNT_inc (sText) ;
+ RETVAL = sText ;
+OUTPUT:
+ RETVAL
void
@@ -715,3 +722,32 @@
+void
+embperl_Element_setAttribut (xDomTree, xNode, sAttr, sText)
+ int xDomTree
+ int xNode
+ SV * sAttr
+ SV * sText
+CODE:
+ IV nAttr ;
+ IV nText ;
+ char * sT = SvPV (sText, nText) ;
+ char * sA = SvPV (sAttr, nAttr) ;
+ tDomTree * pDomTree = DomTree_self (xDomTree) ;
+
+ Element_selfSetAttribut (pDomTree, Node_self (pDomTree, xNode), sA, nAttr, sT,
nText) ;
+
+
+
+
+void
+embperl_Element_removeAttribut (xDomTree, xNode, sAttr)
+ int xDomTree
+ int xNode
+ SV * sAttr
+CODE:
+ IV nAttr ;
+ char * sA = SvPV (sAttr, nAttr) ;
+ tDomTree * pDomTree = DomTree_self (xDomTree) ;
+
+ Element_selfRemoveAttribut (pDomTree, Node_self (pDomTree, xNode), sA, nAttr) ;
1.1.2.15 +206 -53 embperl/Attic/epcomp.c
Index: epcomp.c
===================================================================
RCS file: /home/cvs/embperl/Attic/epcomp.c,v
retrieving revision 1.1.2.14
retrieving revision 1.1.2.15
diff -u -r1.1.2.14 -r1.1.2.15
--- epcomp.c 2000/05/24 21:08:17 1.1.2.14
+++ epcomp.c 2000/05/26 23:31:04 1.1.2.15
@@ -76,7 +76,7 @@
if (ppSV != NULL && *ppSV != NULL &&
SvTYPE(*ppSV) == SVt_RV && SvTYPE((pAV = (AV *)SvRV(*ppSV))) == SVt_PVAV)
{ /* Array reference */
- int f = AvFILL(pAV) ;
+ int f = AvFILL(pAV) + 1 ;
int i ;
IV l ;
char * s ;
@@ -84,7 +84,7 @@
pEmbperlCmds[nNodeName].sPerlCode = malloc (f * sizeof (char *)) ;
pEmbperlCmds[nNodeName].numPerlCode = f ;
- for (i = 0; i <= f; i++)
+ for (i = 0; i < f; i++)
{
ppSV = av_fetch (pAV, i, 0) ;
if (ppSV && *ppSV)
@@ -115,12 +115,184 @@
}
+/* ------------------------------------------------------------------------ */
+/* */
+/* strstrn */
+/* */
+/* find substring of length n */
+/* */
+/* ------------------------------------------------------------------------ */
+
+static const char * strstrn (const char * s1, const char * s2, int l)
+
+ {
+ while (*s1)
+ {
+ if ((s1 = strchr (s1, *s2)) == NULL)
+ return NULL ;
+ if (strncmp (s1, s2, l) == 0)
+ return s1 ;
+ s1++ ;
+ }
+
+ return NULL ;
+ }
+
+
+
+/* ------------------------------------------------------------------------ */
+/* */
+/* embperl_CompileAddChildNode */
+/* */
+/* Add value of child node to perl code */
+/* */
+/* ------------------------------------------------------------------------ */
+int embperl_CompileAddChildNode (/*in*/ tDomTree * pDomTree,
+ /*in*/ tNodeData * pNode,
+ const char * p,
+ const char * q,
+ char op,
+ char out)
+
+
+
+ {
+ const char * or ;
+ const char * eq = strchr (p, ':') ;
+ const char * e = eq?eq:q;
+ int nChildNo = atoi (p) ;
+ struct tNodeData * pChildNode = Node_selfNthChild (pDomTree, pNode, nChildNo) ;
+ const char * sText = Node_selfNodeName(pChildNode) ;
+
+ if (op == '=' && eq)
+ {
+ eq++ ;
+ do
+ {
+ or = strchr (eq + 1, '|') ;
+ e = or?or - 1:q - 1 ;
+ if (strncmp (sText, eq, e - eq) == 0)
+ break ;
+ if (or == NULL)
+ return 0 ;
+ eq = or + 1 ;
+ }
+ while (or) ;
+ }
+ else if (op == '~' && eq)
+ {
+ eq++ ;
+ do
+ {
+ or = strchr (eq + 1, '|') ;
+ e = or?or - 1:q - 1 ;
+ if (strstrn (sText, eq, e - eq))
+ break ;
+ if (or == NULL)
+ return 0 ;
+ eq = or + 1 ;
+ }
+ while (or) ;
+ }
+ else if (op == '!' && pChildNode)
+ {
+ return 0 ;
+ }
+ else if (op == '*' && !pChildNode)
+ {
+ return 0 ;
+ }
+
+ if (pChildNode && out)
+ StringAdd (&pCode, sText, 0) ;
+ else
+ ; // mydie ("missing child") ;
+
+ return 1 ;
+ }
+
/* ------------------------------------------------------------------------ */
+/* */
+/* embperl_CompileAddAttribut */
/* */
-/* embperl_CompileCmd */
+/* Add value of child node to perl code */
/* */
+/* ------------------------------------------------------------------------ */
+
+
+int embperl_CompileAddAttribut (/*in*/ tDomTree * pDomTree,
+ /*in*/ tNodeData * pNode,
+ const char * p,
+ const char * q,
+ char op,
+ char out)
+
+
+
+ {
+ const char * or ;
+ const char * eq = strchr (p, ':') ;
+ const char * e = eq?eq:q;
+ tAttrData * pChildNode = Element_selfGetAttribut (pDomTree, pNode, p, e - p) ;
+ const char * sText = Ndx2String (pChildNode -> xName) ;
+
+ if (op == '=' && eq)
+ {
+ eq++ ;
+ do
+ {
+ or = strchr (eq + 1, '|') ;
+ e = or?or - 1:q - 1 ;
+ if (strncmp (sText, eq, e - eq) == 0)
+ break ;
+ if (or == NULL)
+ return 0 ;
+ eq = or + 1 ;
+ }
+ while (or) ;
+ }
+ else if (op == '~' && eq)
+ {
+ eq++ ;
+ do
+ {
+ or = strchr (eq + 1, '|') ;
+ e = or?or - 1:q - 1 ;
+ if (strstrn (sText, eq, e - eq))
+ break ;
+ if (or == NULL)
+ return 0 ;
+ eq = or + 1 ;
+ }
+ while (or) ;
+ }
+ else if (op == '!' && pChildNode)
+ {
+ return 0 ;
+ }
+ else if (op == '*' && !pChildNode)
+ {
+ return 0 ;
+ }
+
+ if (pChildNode && out && pChildNode -> xValue != 0)
+ {
+ if (pChildNode -> bFlags & aflgAttrChilds)
+ sText = Node_selfNodeName (Node_selfFirstChild (pDomTree, (tNodeData
*)pChildNode)) ;
+ StringAdd (&pCode, sText, 0) ;
+ }
+ else
+ ; // mydie ("missing child") ;
+
+ return 1 ;
+ }
+
+/* ------------------------------------------------------------------------ */
+/* */
+/* embperl_CompileToPerlCode */
+/* */
/* Compile one command inside a node */
/* */
/* ------------------------------------------------------------------------ */
@@ -148,65 +320,46 @@
q = strchr (p+1, '%') ;
if (q)
{
- if (p[1] == '#')
- {
- int nChildNo = atoi (&p[2]) ;
- struct tNodeData * pChildNode = Node_selfNthChild (pDomTree,
pNode, nChildNo) ;
+ char type ;
+ char op ;
+ char out = 1 ;
+
+ p++ ;
+ type = *p ;
+ p++ ;
+ op = *p ;
+ if (op != '=' && op != '*' && op != '!' && op != '~')
+ op = 0 ;
+ else
+ p++ ;
- if (pChildNode)
- StringAdd (&pCode, Node_selfNodeName(pChildNode), 0) ;
- else
- ; // mydie ("missing child") ;
- }
- else if (p[1] == '$')
+ if (*p == '-')
+ out = 0, p++ ;
+
+
+ if (type == '#')
{
- if (p[2] == 'n')
+ if (!embperl_CompileAddChildNode (pDomTree, pNode ,p, q, op, out))
{
- char s [20] ;
- int l = sprintf (s, "$_ep_DomTree,%u", pNode -> xNdx) ;
- StringAdd (&pCode, s, l) ;
+ valid = 0 ;
+ break ;
}
}
- else
+ else if (type == '&')
{
- const char * sVal ;
- tAttrData * pAttr ;
-
- if (p[1] == '=')
- {
- const char * eq = strchr (p + 2, '=') ;
- if (eq)
- {
- pAttr = Element_selfGetAttribut (pDomTree, pNode, p + 2,
eq - p - 2) ;
- if (strnicmp (p + 2, eq + 1, q - eq - 1) != 0)
- {
- valid = 0 ;
- break ;
- }
- }
- }
- else if (p[1] == '!' || p[1] == '*')
+ if (!embperl_CompileAddAttribut (pDomTree, pNode ,p, q, op, out))
{
- pAttr = Element_selfGetAttribut (pDomTree, pNode, p + 2, q - p
- 2) ;
- if ((pAttr && p[1] == '!') || (!pAttr && p[1] == '*') )
- {
- valid = 0 ;
- break ;
- }
+ valid = 0 ;
+ break ;
}
- else
- pAttr = Element_selfGetAttribut (pDomTree, pNode, p + 1, q - p
- 1) ;
-
- if (!pAttr || pAttr -> xValue == 0)
- sVal = NULL ;
- else if (pAttr -> bFlags & aflgAttrValue)
- sVal = Ndx2String (pAttr -> xValue) ;
- else
- sVal = Node_selfNodeName (Node_selfFirstChild (pDomTree,
(tNodeData *)pAttr)) ;
-
- if (sVal)
+ }
+ else if (type == '$')
+ {
+ if (*p == 'n')
{
- StringAdd (&pCode, sVal, 0) ;
+ char s [20] ;
+ int l = sprintf (s, "$_ep_DomTree,%u", pNode -> xNdx) ;
+ StringAdd (&pCode, s, l) ;
}
}
1.1.2.19 +58 -1 embperl/Attic/epdom.c
Index: epdom.c
===================================================================
RCS file: /home/cvs/embperl/Attic/epdom.c,v
retrieving revision 1.1.2.18
retrieving revision 1.1.2.19
diff -u -r1.1.2.18 -r1.1.2.19
--- epdom.c 2000/05/24 14:33:25 1.1.2.18
+++ epdom.c 2000/05/26 23:31:05 1.1.2.19
@@ -1277,7 +1277,7 @@
struct tAttrData * pAttr = (struct tAttrData * )(pNode + 1) ;
int n = pNode -> numAttr ;
- while (n > 0 && nAttrName != pAttr -> xName)
+ while (n > 0 && nAttrName != pAttr -> xName && pAttr -> bFlags)
{
n-- ;
pAttr++ ;
@@ -1316,5 +1316,62 @@
}
+
+
+/* ------------------------------------------------------------------------ */
+/* */
+/* Element_selfSetAttribut */
+/* */
+/* Set attribute value of Element by name */
+/* */
+/* ------------------------------------------------------------------------ */
+
+
+
+tAttrData * Element_selfSetAttribut (/*in*/ tDomTree * pDomTree,
+ /*in*/ struct tNodeData * pNode,
+ /*in*/ const char * sAttrName,
+ /*in*/ int nAttrNameLen,
+ /*in*/ const char * sNewValue,
+ /*in*/ int nNewValueLen)
+
+ {
+ struct tAttrData * pAttr = Element_selfGetAttribut (pDomTree, pNode, sAttrName,
nAttrNameLen) ;
+ tNode xAttr ;
+
+ if (pAttr)
+ {
+ pAttr -> xValue = String2Ndx (sNewValue, nNewValueLen) ;
+ return pAttr ;
+ }
+
+ xAttr = Node_appendChild (pDomTree, ntypAttr, 0, sAttrName, nAttrNameLen, pNode
-> xNdx, 0) ;
+ Node_appendChild (pDomTree, ntypAttrValue, 0, sNewValue, nNewValueLen, xAttr,
0) ;
+ return (tAttrData *)Node_self(pDomTree, xAttr) ;
+ }
+
+
+/* ------------------------------------------------------------------------ */
+/* */
+/* Element_selfRemoveAttribut */
+/* */
+/* Remove attribute of Element by name */
+/* */
+/* ------------------------------------------------------------------------ */
+
+
+
+tAttrData * Element_selfRemoveAttribut (/*in*/ tDomTree * pDomTree,
+ /*in*/ struct tNodeData * pNode,
+ /*in*/ const char * sAttrName,
+ /*in*/ int nAttrNameLen)
+
+ {
+ struct tAttrData * pAttr = Element_selfGetAttribut (pDomTree, pNode, sAttrName,
nAttrNameLen) ;
+
+ if (pAttr)
+ pAttr -> bFlags = 0 ;
+ return pAttr ;
+ }
1.1.2.15 +14 -0 embperl/Attic/epdom.h
Index: epdom.h
===================================================================
RCS file: /home/cvs/embperl/Attic/epdom.h,v
retrieving revision 1.1.2.14
retrieving revision 1.1.2.15
diff -u -r1.1.2.14 -r1.1.2.15
--- epdom.h 2000/05/24 14:33:26 1.1.2.14
+++ epdom.h 2000/05/26 23:31:06 1.1.2.15
@@ -253,3 +253,17 @@
/*in*/ struct tNodeData * pNode,
/*in*/ int n) ;
+
+tAttrData * Element_selfSetAttribut (/*in*/ tDomTree * pDomTree,
+ /*in*/ struct tNodeData * pNode,
+ /*in*/ const char * sAttrName,
+ /*in*/ int nAttrNameLen,
+ /*in*/ const char * sNewValue,
+ /*in*/ int nNewValueLen) ;
+
+
+tAttrData * Element_selfRemoveAttribut (/*in*/ tDomTree * pDomTree,
+ /*in*/ struct tNodeData * pNode,
+ /*in*/ const char * sAttrName,
+ /*in*/ int nAttrNameLen) ;
+
No revision
No revision
1.1.2.9 +29 -14 embperl/Embperl/Attic/Syntax.pm
Index: Syntax.pm
===================================================================
RCS file: /home/cvs/embperl/Embperl/Attic/Syntax.pm,v
retrieving revision 1.1.2.8
retrieving revision 1.1.2.9
diff -u -r1.1.2.8 -r1.1.2.9
--- Syntax.pm 2000/05/24 21:08:27 1.1.2.8
+++ Syntax.pm 2000/05/26 23:31:09 1.1.2.9
@@ -10,7 +10,7 @@
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# $Id: Syntax.pm,v 1.1.2.8 2000/05/24 21:08:27 richter Exp $
+# $Id: Syntax.pm,v 1.1.2.9 2000/05/26 23:31:09 richter Exp $
#
###################################################################################
@@ -48,6 +48,10 @@
{
$new -> {$k} = clonehash ($v, {}, $replace) ;
}
+ elsif (ref ($v) eq 'ARRAY')
+ {
+ $new -> {$k} = [$v] ;
+ }
else
{
$new -> {$k} = $v ;
@@ -80,7 +84,11 @@
'unescape' => 1,
'procinfo' => {
embperl => {
- perlcode => '_ep_rp(%$n%,scalar(do{%#0%}));',
+ perlcode =>
+ [
+ 'if (!defined
(_ep_rp(%$n%,scalar(do{%#~0:$row|$col|$cnt%})))) { last ; }',
+ '_ep_rp(%$n%,scalar(do{%#0%}));',
+ ],
removenode => 4,
}
},
@@ -91,7 +99,10 @@
'unescape' => 1,
'procinfo' => {
embperl => {
- perlcode => '{%#0%;}',
+ perlcode => [
+ 'if (!defined (scalar (do {%#~0:$row|$col|$cnt%})))
{ last ; }',
+ '{%#0%;}',
+ ],
removenode => 3,
mayjump => 1,
},
@@ -133,7 +144,12 @@
clonehash (\%Cmds, \%CmdsLink, { 'unescape' => 2 }) ;
$CmdsLink{'Embperl output code'}{'nodename'} = '[+url' ;
-$CmdsLink{'Embperl output code'}{'procinfo'}{'embperl'}{'perlcode'} =
'_ep_rpurl(%$n%,scalar(do{%#0%}));' ;
+$CmdsLink{'Embperl output code'}{'procinfo'}{'embperl'}{'perlcode'} =
+ [
+ 'if (!defined
(_ep_rpurl(%$n%,scalar(do{%#~0:$row|$col|$cnt%})))) { last ; }',
+ '_ep_rpurl(%$n%,scalar(do{%#0%}));',
+ ] ;
+
@@ -223,10 +239,9 @@
embperl => {
perlcode =>
[
- 'HTML::Embperl::Cmd::InputCheck (%$n%, \'%*name%\',
\'%*value%\') ; %=type=radio% ',
- 'HTML::Embperl::Cmd::InputCheck (%$n%, \'%*name%\',
\'%*value%\') ; %=type=checkbox% ',
- '$idat{\'%*name%\'} = \'%*value%\' ; ',
- 'HTML::Embperl::Cmd::InputText (%$n%, \'%*name%\') ;
%!value%',
+ 'if ($fdat{\'%&*name%\'} eq \'%&*value%\') {
HTML::Embperl::Node::Element_setAttribut (%$n%, \'checked\', undef) } else
{HTML::Embperl::Node::Element_removeAttribut (%$n%, \'checked\') };
%&=type:radio|checkbox% ',
+ 'HTML::Embperl::Node::Element_setAttribut (%$n%, \'value\',
$fdat{\'%&*name%\'}) ; %&!value%',
+ '$idat{\'%&*name%\'} = \'%&*value%\' ; ',
]
}
},
@@ -348,7 +363,7 @@
'endtag' => 'endif',
'procinfo' => {
embperl => {
- perlcode => 'if (%<noname>%) { ',
+ perlcode => 'if (%&<noname>%) { ',
perlcodeend => '}',
removenode => 10,
mayjump => 1,
@@ -381,7 +396,7 @@
'endtag' => 'endif',
'procinfo' => {
embperl => {
- perlcode => 'elsif (%<noname>%) { ',
+ perlcode => 'elsif (%&<noname>%) { ',
perlcodeend => '}',
removenode => 10,
mayjump => 1,
@@ -396,7 +411,7 @@
'endtag' => 'endwhile',
'procinfo' => {
embperl => {
- perlcode => 'while (%<noname>%) { ',
+ perlcode => 'while (%&<noname>%) { ',
perlcodeend => '}',
removenode => 10,
mayjump => 1,
@@ -415,7 +430,7 @@
'endtag' => 'endforeach',
'procinfo' => {
embperl => {
- perlcode => 'foreach %<noname>% { ',
+ perlcode => 'foreach %&<noname>% { ',
perlcodeend => '}',
removenode => 10,
mayjump => 1,
@@ -434,7 +449,7 @@
'procinfo' => {
embperl => {
perlcode => 'do { ',
- perlcodeend => '} until (%<noname>%) ; ',
+ perlcodeend => '} until (%&<noname>%) ; ',
removenode => 10,
mayjump => 1,
}
@@ -452,7 +467,7 @@
'unescape' => 1,
'procinfo' => {
embperl => {
- perlcode => 'use strict ; use vars qw {%<noname>%} ;',
+ perlcode => 'use strict ; use vars qw {%&<noname>%} ;',
removenode => 3,
}
},
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]