Hello Everyone!
I have been using various operating systems in different hardware platforms for
various reasons.
I have been using the LFS and BLFS instructions for some years now, but this is
my first post.
First of all, I would like to congratulate the LFS developer groups for their
excellent work on this project.
To my eyes it provides the single best way for people not only to learn
GNU/Linux, but also GNU/Linux deployment
in a production environment. I have never had an unresolvable issue with LFS /
BLFS or my own mix of those two.
Thanking could proceed to evangelism here so I will stop (for now).
Automation is a must if you are to deploy an LFS - based platform.
I have been using some of the methods posted by your developer group, some
others of my own mix too.
jhlfs is a nice project, and I hope that there is always going to be a bash -
based method of automation.
Why? Even if bash is slow compared to a structured binary, a structured script
can be equally useful when building a small core for zero.
I really like the idea of using the XML sources of the book, and wondered if
there was a way to get rid of a third party dependence,
i.e. the XML parser binary (whatever that may be). After a search over the internet, I
found out that even if there is a bash "script"
parsing a XML document, that is always done using a third party application /
utility.
The following is an attempt to get rid of such a dependency, for only pure bash
is used.
I have some other scripts that I could merge with it. It does not support
comments / preprocessing stuff,
it will work with anything of the following form:
####### starts here ########
<xmlroot>
<hello attribute="323"> LFS "owns"! </hello>
<another stuff="34243"
hellomate="somestuffheretoo"
/>
</xmlroot>
####### ends here ##########
As long as your document is like something of the above, it will work. It
outputs the result to two different arrays:
one for keeping status, the other for keeping data. There is no validation
(this is experimental...) so do provide valid documents.
Also remember that attributes and their values must be fully declared in a
single line (ie do NOT span quotes between lines).
For testing I have been using rather nasty XML syntax mixes, and for now it
worked. I am waiting for your comments if you care to
give this a try.
Thank you.
-----------------------------------------------------CUT STARTS
HERE--------------------------------------------------
#!/bin/bash
# project : a possible add-in for jhlfs?
# name : bparser
# version : 0.7e (JAN2606)
# author : George Makrydakis <[EMAIL PROTECTED]>
# license : GPL v 2.x or up
# info : bash - based XML pseudoparser for the jhLFS
Project
# status : any valid XML document can be parsed by this
script, just substitute the myfile variable
declare -a xmlSTAT # contains the status
informer
declare -a xmlDATA # contains any relevant
data (element/attributes name/values and unparsed data)
declare -i xINDEX=0 # global xINDEX pointer
for xml**** arrays
declare -i checkpoint=0 # a character counter &
pointer for parserLINE
declare -i doall=0 # a simple counter
variable
declare -r myfile="recent.xml" # the filename / path of the file to
"parse"
declare -r startTAG='<' # literal <
declare -r closeTAG='>' # literal >
declare -r slashTAG='/' # literal /
declare -r equalTAG='=' # literal =
declare -r quoteTAG='"' # literal "
declare -r whiteTAG=' ' # literal
declare elmentATTN="" # element attribute name
declare elmentATTV="" # element attribute value
declare elmentNAME="" # element name value
declare elmentDUMP="" # element name dump
declare parserLINE="" # contains a single line read
from the XML document sent to the parser
declare parserFLAG="ENABLED" # can have two mutually exclusive
values: ENABLED / DISABLD
declare parserFILE="" # file sent to the parser
declare parserBUFF="" # parser buffer variable
while read parserLINE
do
parserBUFF=""
for ((checkpoint=0; checkpoint < ${#parserLINE}; checkpoint++))
;
do
case ${parserLINE:$checkpoint:1} in
$startTAG)
let "checkpoint++"; elmentNAME="";
parserFLAG="ENABLED"
if [ "$parserBUFF" != '' ] ; then
xmlSTAT[xINDEX]="#"
xmlDATA[xINDEX]="$parserBUFF"
let "xINDEX++"
parserBUFF=""
fi
until [ "${parserLINE:$checkpoint:1}" = ' ' ]
|| \
[ "${parserLINE:$checkpoint:1}" = '>'
] || \
[ $checkpoint = ${#parserLINE} ];
do
elmentNAME=$elmentNAME${parserLINE:$checkpoint:1}
let "checkpoint++"
done
if [ "${elmentNAME:0:1}" = "$slashTAG" ] ; then
xmlDATA[xINDEX]="${elmentNAME#*/}"
xmlSTAT[xINDEX]="$closeTAG"
let "xINDEX++"
parserBUFF=""
else
xmlDATA[xINDEX]="$elmentNAME"
xmlSTAT[xINDEX]="$startTAG"
let "xINDEX++"; parserBUFF=""
case ${parserLINE:$checkpoint:1} in
$whiteTAG)
elmentDUMP="$elmentNAME" ;;
'')
elmentDUMP="$elmentNAME" ;;
esac
fi
;;
$slashTAG)
case $parserFLAG in
ENABLED)
if [ "${parserLINE:$((checkpoint + 1)):1}" =
"$closeTAG" ] ; then
xmlSTAT[xINDEX]="$closeTAG"
xmlDATA[xINDEX]="$elmentDUMP"
let "xINDEX++"
elmentDUMP=""; parserBUFF=""; let
"checkpoint+=2"
fi
;;
DISABLD)
;;
esac
;;
$quoteTAG)
case $parserFLAG in
ENABLED)
let "checkpoint++"; elmentATTV="";
parserBUFF=""
until [
"${parserLINE:$checkpoint:1}" = '"' ] ;
do
elmentATTV=$elmentATTV${parserLINE:$checkpoint:1}
let
"checkpoint++"
done
let "checkpoint++";
xmlDATA[xINDEX]="$elmentATTV"; let "xINDEX++"
case
${parserLINE:$checkpoint:1} in
$closeTAG) if [
"${parserLINE:$((checkpoint + 1)):1}" = '<' ] ; then let "checkpoint-=1"; fi ;;
$slashTAG) let
"checkpoint-=1" ;;
esac
;;
DISABLD)
;;
esac
;;
$equalTAG)
case $parserFLAG in
ENABLED)
elmentATTN=""
if [ ${parserLINE:$((checkpoint +
1)):1} = '"' ] ; then
elmentATTN=${parserBUFF##$equalTAG}
elmentATTN=${elmentATTN##*$whiteTAG}
xmlSTAT[xINDEX]="$elmentATTN"
fi
;;
DISABLD)
;;
esac
;;
esac
case $((checkpoint + 1)) in
${#parserLINE})
parserBUFF=$parserBUFF${parserLINE:$checkpoint:1}
if [ "${parserLINE:$checkpoint:1}" !=
"$closeTAG" ] ; then
xmlSTAT[xINDEX]="#"
xmlDATA[xINDEX]="$parserBUFF"
let "xINDEX++"
fi
;;
*)
case
${parserLINE:$checkpoint:1} in
$closeTAG) parserBUFF="";
parserFLAG="DISABLD";;
*)
parserBUFF=$parserBUFF${parserLINE:$checkpoint:1};;
esac
;;
esac
done
done < "$myfile"
#########################################################################################
function helpmeout ()
{
clear
for (( doall=0; doall < $xINDEX; doall++ )) ;
do
echo -e "${xmlSTAT[doall]}"":""${xmlDATA[doall]}"
done
}
helpmeout
--------------------------------------------------------------------------- CUT
ENDS HERE----------------------------------------------------
--
http://linuxfromscratch.org/mailman/listinfo/alfs-discuss
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page