Nimbin[12]?Mirrors & Forks / jhalfs / commits / a6c57de

jhalfs git · trunk

jhalfs LFS build automation (mirror)

lfs mirror bash · first commit 2005-09-11 · last commit 2024-02-13 (2 years ago) · synced 3 days ago · upstream: git.linuxfromscratch.org/jhalfs

Python 78.4% Shell 19.8% Makefile 1.8%
git clone https://git.christianimmanuel.de/mirrors-forks/jhalfs.gitwget https://git.christianimmanuel.de/mirrors-forks/jhalfs/archive/jhalfs.tar.gz

Process <prompt> tags in mit-kerberos

Pierre Labastie · 2023-09-16 19:58 · a6c57debccce241cc455431cf5220054581d3c3d

when we have a command followed by prompts:
command
<prompt>command:</prompt> instr
...
we want to transform to:
command << PROMPT_EOF
instr
...
quit
PROMPT_EOF.
This patch implements this. The problem is that the <prompt>
tags may occur in several consecutive <screen> ones. So we create
a  fragment tree and process it recursively.
 BLFS/xsl/process-prompt.xsl | 99 +++++++++++++++++++++++++++++++++++++++++++++
 BLFS/xsl/scripts.xsl        | 20 ++++++++-
 2 files changed, 117 insertions(+), 2 deletions(-)

diff --git a/BLFS/xsl/process-prompt.xsl b/BLFS/xsl/process-prompt.xsl
new file mode 100644
index 0000000..8f3457c
--- /dev/null
+++ b/BLFS/xsl/process-prompt.xsl
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    version="1.0">
+
+  <xsl:template name="process-prompt">
+    <xsl:param name="instructions"/>
+    <xsl:param name="root-seen"/>
+    <xsl:param name="prompt-seen"/>
+
+<!-- Isolate the current instruction -->
+    <xsl:variable name="current-instr" select="$instructions[1]"/>
+
+    <xsl:choose>
+<!--============================================================-->
+<!-- First, if we have an empty tree, close everything and exit -->
+      <xsl:when test="not($current-instr)">
+        <xsl:if test="$prompt-seen">
+          <xsl:call-template name="end-prompt"/>
+        </xsl:if>
+        <xsl:if test="$root-seen">
+          <xsl:call-template name="end-root"/>
+        </xsl:if>
+      </xsl:when><!-- end empty tree -->
+<!--============================================================-->
+      <xsl:when test="$current-instr[@role='root']">
+        <xsl:choose>
+          <xsl:when test="$current-instr//prompt">
+            <xsl:if test="not($root-seen)">
+              <xsl:call-template name="begin-root"/>
+            </xsl:if>
+            <xsl:text>&#xA;</xsl:text>
+            <xsl:if test="not($prompt-seen)">
+              <xsl:copy-of
+                select="substring-before($current-instr//text()[1],'&#xA;')"/>
+              <xsl:text> &lt;&lt; PROMPT_EOF
+</xsl:text>
+            </xsl:if>
+            <xsl:apply-templates
+              select="$current-instr/userinput/node()[position()>1]"/>
+            <xsl:call-template name="process-prompt">
+              <xsl:with-param
+                 name="instructions"
+                 select="$instructions[position()>1]"/>
+              <xsl:with-param name="root-seen" select="boolean(1)"/>
+              <xsl:with-param name="prompt-seen" select="boolean(1)"/>
+            </xsl:call-template>
+          </xsl:when><!-- end prompt as root -->
+<!--____________________________________________________________ -->
+          <xsl:otherwise><!-- we have no prompt -->
+            <xsl:if test="$prompt-seen">
+              <xsl:text>
+quit
+PROMPT_EOF</xsl:text>
+            </xsl:if>
+            <xsl:apply-templates
+              select="$current-instr"
+              mode="config"/>
+            <!-- the above will call "end-root" if the next screen
+                 sibling is not role="root". We need to pass root-seen=false
+                 in this case. Otherwise, we need to pass root-seen=true.
+                 So create a variable -->
+            <xsl:variable name="rs"
+              select="$instructions[2][@role='root']"/>
+            <xsl:call-template name="process-prompt">
+              <xsl:with-param
+                 name="instructions"
+                 select="$instructions[position()>1]"/>
+              <xsl:with-param name="root-seen" select="boolean($rs)"/>
+              <xsl:with-param name="prompt-seen" select="boolean(0)"/>
+            </xsl:call-template>
+          </xsl:otherwise><!-- end no prompt -->
+<!--____________________________________________________________ -->
+        </xsl:choose>
+      </xsl:when><!-- role="root" -->
+<!--============================================================-->
+      <xsl:otherwise><!-- no role -->
+        <xsl:if test="$prompt-seen">
+          <xsl:text>
+quit
+PROMPT_EOF</xsl:text>
+        </xsl:if>
+        <xsl:if test="$root-seen">
+          <xsl:call-template name="end-root"/>
+        </xsl:if>
+        <xsl:apply-templates select="$current-instr/userinput"/>
+        <xsl:call-template name="process-prompt">
+          <xsl:with-param
+             name="instructions"
+             select="$instructions[position()>1]"/>
+          <xsl:with-param name="root-seen" select="boolean(0)"/>
+          <xsl:with-param name="prompt-seen" select="boolean(0)"/>
+        </xsl:call-template>
+      </xsl:otherwise><!-- no role -->
+<!--============================================================-->
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match="prompt"/>
+</xsl:stylesheet>
diff --git a/BLFS/xsl/scripts.xsl b/BLFS/xsl/scripts.xsl
index 78f61ad..01ff31c 100644
--- a/BLFS/xsl/scripts.xsl
+++ b/BLFS/xsl/scripts.xsl
@@ -80,6 +80,9 @@ done</xsl:variable>
 <!-- include the template for replaceable tags -->
   <xsl:include href="process-replaceable.xsl"/>
 
+<!-- include the template for prompt tags -->
+  <xsl:include href="process-prompt.xsl"/>
+
 <!--=================== Begin processing ========================-->
 
   <xsl:template match="/">
@@ -385,8 +388,21 @@ echo Start Time: ${SECONDS} >> $INFOLOG
 
       <xsl:when test="@role = 'configuration'">
         <xsl:text>&#xA;</xsl:text>
-        <xsl:apply-templates mode="config"
-             select=".//screen[not(@role = 'nodump') and ./userinput]"/>
+        <xsl:choose>
+          <xsl:when test=".//screen/userinput/prompt">
+            <xsl:call-template name="process-prompt">
+              <xsl:with-param
+                name="instructions"
+                select=".//screen[not(@role = 'nodump') and ./userinput]"/>
+              <xsl:with-param name="root-seen" select="false"/>
+              <xsl:with-param name="prompt-seen" select="false"/>
+            </xsl:call-template>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:apply-templates mode="config"
+                 select=".//screen[not(@role = 'nodump') and ./userinput]"/>
+          </xsl:otherwise>
+        </xsl:choose>
       </xsl:when><!-- @role="configuration" -->
 
     </xsl:choose>