Updated to handle VALUEPREFIX type entries.

At least I think it does. Don't have any to test it on [Wink]

code:
Break On

Global $bInString $bInString=0
Global $bIsEnding $bIsEnding=0
Global $sString
Global $cQuote $cQuote='"'
Global $sAction
Global $sHive
Global $sKey
Global $sEntry
Global $sIniFile

; Constants
Global $INDENT $INDENT=" | "
Global $BRANCH $BRANCH=" |-"
Global $SPACES $SPACES=" "
Global $TAB $TAB=Chr(9)

; Call UDF
$=udfDocPolicy(".\common.adm")

Function udfDocPolicy($sPolicyFile)
If Open(1,$sPolicyFile)
"Cannot open file " $sPolicyFile " for reading." ?
$udfDocPolicy=1
Return
EndIf

$sIniFile=$sPolicyFile

$sData=ReadLine(1)
While @ERROR=0
; Convert tabs to spaces.
; How long did it take me to work out why the split was failing!
; Doh!
$iIndex=InStr($sData,$TAB)
While $iIndex
$sData="" + SubStr($sData,1,$iIndex-1) + " " + SubStr($sData,$iIndex+1,9999)
$iIndex=InStr($sData,$TAB)
Loop
udfParseLine(Split($sData))
$sData=ReadLine(1)
Loop
$udfDocPolicy=0
Return
EndFunction

Function udfParseLine($asData)
$iArraySize=Ubound($asData)
For $iIndex = 0 To $iArraySize
udfInterpret($asData[$iIndex])
Next
EndFunction

Function udfInterpret($sToken)

If $bInString=0 $sString="" EndIf

If $sAction = ""
Select
Case $sToken="END"
$sAction=$sToken
Case $sToken="CLASS"
$sAction=$sToken
Case $sToken="CATEGORY"
$sAction=$sToken
Case $sToken="PART"
$sAction=$sToken
Case $sToken="POLICY"
$sAction=$sToken
Case $sToken="KEYNAME"
$sAction=$sToken
Case $sToken="VALUENAME"
$sAction=$sToken
Case $sToken="VALUEPREFIX"
$sAction=$sToken
EndSelect
Else
Select
Case $bInString
$sString=$sString + " " + $sToken
If SubStr($sToken,Len($sToken),1)=$cQuote
$bInString=0
$sString=SubStr($sString,1,Len($sString)-1)
EndIf
Case $sToken=""
Return
Case SubStr($sToken,1,1)=$cQuote
$bInString=1
$sString=SubStr($sToken,2,Len($sToken)-1)
If SubStr($sString,Len($sString),1)=$cQuote
$bInString=0
$sString=SubStr($sString,1,Len($sString)-1)
EndIf
Case SubStr($sToken,1,2)="!!"
; Get parameter from string fields
$sString=ReadProfileString($sIniFile,"strings",SubStr($sToken,3,99))
EndSelect
; Actions.
If $bInString Return EndIf
Select
Case $sAction="END"
Select
Case $sToken="CATEGORY"
$sIndent=SubStr($sIndent,1,Len($sIndent)-Len($INDENT))
EndSelect
$sAction=""
Case $sAction="CLASS"
? "Registry hive: " $sToken ?
$sIndent=""
Select
Case $sToken="MACHINE"
$sHive="HKEY_LOCAL_MACHINE"
Case $sToken="USER"
$sHive="HKEY_CURRENT_USER"
EndSelect
Case $sAction="CATEGORY"
$sIndent $BRANCH
If $sString="" $sToken Else $sString EndIf
?
$sIndent=""+$sIndent+$INDENT
Case $sAction="POLICY"
$sIndent $SPACES "Policy: "
If $sString="" $sToken Else $sString EndIf
?
Case $sAction="KEYNAME"
If $sString="" $sKey=$sToken Else $sKey=$sString EndIf
$sIndent $SPACES "Key: " $sKey ?
Case $sAction="VALUENAME"
If $sString="" $sEntry=$sToken Else $sEntry=$sString EndIf
$sIndent $SPACES $SPACES "Entry: '" $sEntry "'=" ReadValue($sHive + "\" + $sKey,$sEntry) ?
Case $sAction="VALUEPREFIX"
$iEnum=0
$sEntry=EnumValue($sHive + "\" + $sKey,$iEnum)
While @ERROR=0
"ERROR=@ERROR, Enum=$iEnum, Entry=$sEntry" ?
If $sString=SubStr($sEntry,1,Len($sString))
$sIndent $SPACES $SPACES "Entry: '" $sEntry "'="
ReadValue($sHive + "\" + $sKey,$sEntry) ?
EndIf
$iEnum=$iEnum+1
$sEntry=EnumValue($sHive + "\" + $sKey,$iEnum)
Loop
EndSelect
$sAction=""
$bIsEnding=0
EndIf
EndFunction



[ 15 July 2002, 16:19: Message edited by: Richard Howarth ]