|
WLau, I thank you very very much :-) It works!
My source file CCSID is 37, then I changed the job CCSID to 37 with CHGJOB
CCSID(37)
and here is the result of HELLOXML from the job log:
XML Event XML Text
START-OF-DOCUMENT <?xml version="1.0" encoding
="ibm-37"?> <msg type="succinct">Hello, World!</msg>
VERSION-INFORMATION 1.0
ENCODING-DECLARATION ibm-37
START-OF-ELEMENT msg
ATTRIBUTE-NAME type
ATTRIBUTE-CHARACTERS succinct
CONTENT-CHARACTERS Hello, World!
END-OF-ELEMENT msg
END-OF-DOCUMENT
Now I have the other little problem:
When in the debugger and try to look at the content of the variable
XML-Text, I get this message
Message ID . . . . . . : MCH0601 Severity . . . . . . . : 40
Message type . . . . . : Diagnostic
Date sent . . . . . . : 20/09/05 Time sent . . . . . . :
08:56:43
Message . . . . : Space offset X'00FFF000' or X'0000000000000000' is
outside
current limit for object &1.
Cause . . . . . : A program tried to set a space pointer or use storage
outside a space, or tried to use an unallocated page in teraspace. The
space
class is X'04'. The space class designates the type of space:
00-primary associated space (includes space objects).
01-secondary associated space 0.
02-implicit process space for automatic storage.
03-implicit process space for static storage in activation group mark
X'00000000'.
04-implicit process space for heap identifier X'00000000' in
activation
group mark X'00000000'.
05-constant space.
06-space for handle-based heap identifier X'00000000'.
07-teraspace offset X'0000000000000000'.
08-teraspace for OS/400 PASE memory address X'0000000000000000'.
Offset X'00FFF000' only applies to storage outside teraspace.
X'8000000000000000DDFC99ED4E001000' is a pointer to the teraspace page
o
the start of the implicit process space for the allocation.
Is this behaviour of the debugger normal or not? Did you observe this
behaviour in your debugger too?
wlau@xxxxxxxxxxx
Sent by: cobol400-l-bounces@xxxxxxxxxxxx
19.09.2005 16:00
Please respond to
COBOL Programming on the iSeries/AS400 <cobol400-l@xxxxxxxxxxxx>
To
"COBOL Programming on the iSeries/AS400" <cobol400-l@xxxxxxxxxxxx>
cc
Subject
Re: [COBOL400-L] Problem with XML PARSE in ILE COBOL V5R3
Finally figured it out. The parser is using the job run CCSID. You need to
CHGJOB CCSID(37) prior running.
> We have PTF SI13650 too:
>
> General information
>
> Product ID/PTF ID . . . . . . . . . . : 5722WDS SI13650
> Release . . . . . . . . . . . . . . . : V5R3M0
>
> On order . . . . . . . . . . . . . . . : No
> PTF save file . . . . . . . . . . . . : No
> PTF status . . . . . . . . . . . . . . : Temporarily applied
> Latest superseding PTF . . . . . . . . : None
> Status date/time . . . . . . . . . . . : 07/07/05 15:57:36
> Type . . . . . . . . . . . . . . . . . : Immediate
> Unattended IPL action . . . . . . . . : None
> Optional part . . . . . . . . . . . . : 0041
> PTF library . . . . . . . . . . . . . : QCBLLE
> Cover letter . . . . . . . . . . . . . : No
> Mandatory instructions . . . . . . . . : No
> Test Fix . . . . . . . . . . . . . . . : No
> Action pending . . . . . . . . . . . . : No
> Action required . . . . . . . . . . . : No
> Target OS/400 release . . . . . . . . : V5R3M0
> PTF creation date/time . . . . . . . . : 31/05/04 16:22:37
>
>
>
>
> wlau@xxxxxxxxxxx
> Sent by: cobol400-l-bounces@xxxxxxxxxxxx
> 14.09.2005 23:02
> Please respond to
> COBOL Programming on the iSeries/AS400 <cobol400-l@xxxxxxxxxxxx>
>
>
> To
> "COBOL Programming on the iSeries/AS400" <cobol400-l@xxxxxxxxxxxx>
> cc
>
> Subject
> Re: [COBOL400-L] Problem with XML PARSE in ILE COBOL V5R3
>
>
>
>
>
>
> FYI, my ILE COBOL compiler PTF level is at SI13650.
>
>
>> Thank you for information,
>>
>> but that PTF don't help me - with DSPPTF i found out, that we had
> this
>> PTF already installed
>>
>> Product ID/PTF ID . . . . . . . . . . : 5722SS1 SI12032
>> Release . . . . . . . . . . . . . . . : V5R3M0
>>
>> On order . . . . . . . . . . . . . . . : No
>> PTF save file . . . . . . . . . . . . : No
>> PTF status . . . . . . . . . . . . . . : Permanently applied
>> Latest superseding PTF . . . . . . . . : SI16546
>> Status date/time . . . . . . . . . . . : 06/04/04 18:15:42
>> Type . . . . . . . . . . . . . . . . . : Immediate
>> Unattended IPL action . . . . . . . . : None
>> Optional part . . . . . . . . . . . . : *BASE
>> PTF library . . . . . . . . . . . . . : QSYS
>> Cover letter . . . . . . . . . . . . . : No
>> Mandatory instructions . . . . . . . . : No
>> Test Fix . . . . . . . . . . . . . . . : No
>> Action pending . . . . . . . . . . . . : No
>> Action required . . . . . . . . . . . : No
>> Target OS/400 release . . . . . . . . : V5R3M0
>> Minimum-Maximum level . . . . . . . . : L0B-L00
>> PTF creation date/time . . . . . . . . : 11/02/04 15:33:15
>>
>>
>>
>>
>> wlau@xxxxxxxxxxx
>> Sent by: cobol400-l-bounces@xxxxxxxxxxxx
>> 13.09.2005 17:08
>> Please respond to
>> COBOL Programming on the iSeries/AS400 <cobol400-l@xxxxxxxxxxxx>
>>
>>
>> To
>> "COBOL Programming on the iSeries/AS400" <cobol400-l@xxxxxxxxxxxx>
>> cc
>>
>> Subject
>> Re: [COBOL400-L] Problem with XML PARSE in ILE COBOL V5R3
>>
>>
>>
>>
>>
>>
>> Try this:
>>
>>
>
http://www-912.ibm.com/n_dir/nas4apar.nsf/fd9ac656a54b8cf286256e770069b197/ce22abf9c407373e86256eab003ca9b5?OpenDocument&Highlight=2,5722SS111
>
>>
>>
>> PTF is SI12032.
>>
>>
>>> Do you know, where I find the PTFs ?
>>>
>>>
>>>
>>>
>>> wlau@xxxxxxxxxxx
>>> Sent by: cobol400-l-bounces@xxxxxxxxxxxx
>>> 13.09.2005 16:08
>>> Please respond to
>>> COBOL Programming on the iSeries/AS400 <cobol400-l@xxxxxxxxxxxx>
>>>
>>>
>>> To
>>> "COBOL Programming on the iSeries/AS400" <cobol400-l@xxxxxxxxxxxx>
>>> cc
>>>
>>> Subject
>>> Re: [COBOL400-L] Problem with XML PARSE in ILE COBOL V5R3
>>>
>>>
>>>
>>>
>>>
>>>
>>> I simply compile with default and my source CCSID is 37. I also tried
>> your
>>> compile options and it works fine.
>>>
>>> It's probably a good idea to check for latest V5R3 PTF for both ILE
>> COBOL
>>> compiler and runtime.
>>>
>>>
>>>> I tried it once again, The CCSID of my source file is 37, and I
>> compiled
>>>> it with
>>>>
>>>> CRTBNDCBL PGM(RM/HELLOXML)
>>>> SRCFILE(RM/XMLSRC) SRCMBR(HELLOXML)
>>>> OPTION(*SOURCE *APOST) DBGVIEW(*SOURCE) ACTGRP(*CALLER)
>>>> CCSID(037)
>>>>
>>>> but I got the same error XML-CODE = 000000051.
>>>>
>>>> What is the CCSID of your source file and with which command did you
>>>> compile?
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> wlau@xxxxxxxxxxx
>>>> Sent by: cobol400-l-bounces@xxxxxxxxxxxx
>>>> 12.09.2005 22:54
>>>> Please respond to
>>>> COBOL Programming on the iSeries/AS400 <cobol400-l@xxxxxxxxxxxx>
>>>>
>>>>
>>>> To
>>>> "COBOL Programming on the iSeries/AS400" <cobol400-l@xxxxxxxxxxxx>
>>>> cc
>>>>
>>>> Subject
>>>> Re: [COBOL400-L] Problem with XML PARSE in ILE COBOL V5R3
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> Your HelloXML program seems to work with me. I have the following in
>> the
>>>> joblog:
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> XML Event XML Text
>>>>
>>>> START-OF-DOCUMENT <?xml version="1.0" encoding
>>>>
>>>> ="ibm-37"?> <msg type="succinct">Hello, World!</msg>
>>>>
>>>> VERSION-INFORMATION 1.0
>>>>
>>>> ENCODING-DECLARATION ibm-37
>>>>
>>>> START-OF-ELEMENT msg
>>>>
>>>> ATTRIBUTE-NAME type
>>>>
>>>> ATTRIBUTE-CHARACTERS succinct
>>>>
>>>> CONTENT-CHARACTERS Hello, World!
>>>>
>>>> END-OF-ELEMENT msg
>>>>
>>>> END-OF-DOCUMENT
>>>>
>>>>
>>>>
>>>>
>>>>> Part 1 (3 Aug 05)
>>>>> I'm trying to test the new feature of ILE COBOL V5R3, the XML PARSE
>>>>> ability, but I have problems.
>>>>> When I try this simplest example:
>>>>>
>>>>> Identification division.
>>>>> Program-id. HelloXML.
>>>>> Data division.
>>>>> Working-storage section.
>>>>> 1 M.
>>>>> 2 pic x(40) value
>>>>> '<?xml version="1.0" encoding="ibm-37"?>'.
>>>>> 2 pic x(40) value
>>>>> '<msg type="succinct">Hello, World!</msg>'.
>>>>> Procedure division.
>>>>> Display 'XML Event XML Text'
>>>>> XML Parse M
>>>>> Processing procedure P
>>>>> End-XML
>>>>> Goback.
>>>>> P.
>>>>> If XML-Code = 0
>>>>> Display XML-Event XML-Text
>>>>> End-if.
>>>>> End program HelloXML.
>>>>>
>>>>> I obtain Exception. The values of registers are:
>>>>>
>>>>> XML-CODE = 000000051 i.e. "The document was encoded in EBCDIC, and
> the
>>>>> document encoding declaration specified a supported EBCDIC encoding,
>>> but
>>>>> the parser does not support the CCSID of the COBOL source member."
>>>>>
>>>>> I'dont know why the parser does not support the CCSID of my source
>>>> member,
>>>>> because the CCSID of my source file is 37 (just like the CCSID of
> XML)
>>>>>
>>>>> XML-EVENT = 'EXCEPTION '
>>>>>
>>>>> When I try to look at XML-TEXT, I become the following message:
>>>>>
>>>>> Message ID . . . . . . : MCH0601 Severity . . . . . . . : 40
>>>>> Message type . . . . . : Diagnostic
>>>>> Date sent . . . . . . : 03/08/05 Time sent . . . . . . :
>>>> 09:13:55
>>>>>
>>>>> Message . . . . : Space offset X'00FFF000' or X'0000000000000000' is
>>>>> outside
>>>>> current limit for object &1.
>>>>> Cause . . . . . : A program tried to set a space pointer or use
>> storage
>>>>> outside a space, or tried to use an unallocated page in teraspace.
> The
>>>>> space
>>>>> class is X'04'. The space class designates the type of space:
>>>>> 00-primary associated space (includes space objects).
>>>>> 01-secondary associated space 0.
>>>>> 02-implicit process space for automatic storage.
>>>>> 03-implicit process space for static storage in activation group
mark
>>>>> X'00000000'.
>>>>> 04-implicit process space for heap identifier X'00000000' in
>> activation
>>>>> group mark X'00000000'.
>>>>> 05-constant space.
>>>>> 06-space for handle-based heap identifier X'00000000'.
>>>>> 07-teraspace offset X'0000000000000000'.
>>>>> 08-teraspace for OS/400 PASE memory address X'0000000000000000'.
>>>>> Offset X'00FFF000' only applies to storage outside teraspace.
>>>>> X'8000000000000000F1D06F2C2E001000' is a pointer to the teraspace
> page
>>>> or
>>>>> the start of the implicit process space for the allocation.
>>>>>
>>>>> Can anybody say me, what's going wrong?
>>>>>
>>>>>
>>>>> Part 2 (11 Aug 05 8:34)
>>>>> The above mentioned problem can be partially solved by placing the
> XML
>>>>> document (encoded in CCSID=819) in the IFS directory e.g.
> /home/user1.
>>>> The
>>>>> CCSID defined inside of the XML document must be 819 too, i.e.:
>>>>>
>>>>> <?xml version="1.0" encoding="ibm-819" standalone="yes"?>
>>>>> <!--This document is just an example-->
>>>>> <sandwich>
>>>>> <bread type="baker's best"/>
>>>>> <?spread please use real mayonnaise ?>
>>>>> <meat>Ham & turkey</meat>
>>>>> <filling>Cheese, lettuce, tomato, etc. </filling>
>>>>> <![CDATA[We should add a <relish> element in future!]]>
>>>>> <listprice>$4.99 </listprice>
>>>>> <discount>0.10</discount>
>>>>> </sandwich>
>>>>>
>>>>> and here is the COBOL sample program
>>>>>
>>>>> Process APOST
>>>>> Identification division.
>>>>> Program-id. xmlsampl2.
>>>>>
>>>>> Data division.
>>>>> Working-storage section.
>>>>> ******************************************************************
>>>>> * XML document, encoded as initial values of data items. *
>>>>> ******************************************************************
>>>>> 1 xml-id pic x(27) value '/home/user1/xmlsampldoc.xml'.
>>>>> 1 xml-document-length computational pic 999.
>>>>>
>>>>> ******************************************************************
>>>>> * Sample data definitions for processing numeric XML content.
*
>>>>> ******************************************************************
>>>>> 1 current-element pic x(30).
>>>>> 1 list-price computational pic 9v99
>> value 0.
>>>>> 1 discount computational pic 9v99 value 0.
>>>>> 1 display-price pic $$9.99.
>>>>> Procedure division.
>>>>> mainline section.
>>>>>
>>>>> XML PARSE FILE-STREAM xml-id PROCESSING PROCEDURE
>>> xml-handler
>>>>> ON EXCEPTION
>>>>> display 'XML document error ' XML-CODE
>>>>> NOT ON EXCEPTION
>>>>> display 'XML document successfully parsed'
>>>>> END-XML
>>>>>
>>>>> ******************************************************************
>>>>> * Process the transformed content and calculate promo price. *
>>>>> ******************************************************************
>>>>> display ' '
>>>>> display '-----+++++***** Using information from XML '
>>>>> '*****+++++-----'
>>>>> display ' '
>>>>> move list-price to display-price
>>>>> display ' Sandwich list price: ' display-price
>>>>> compute display-price = list-price * (1 - discount)
>>>>> display ' Promotional price: ' display-price
>>>>> display ' Get one today!'
>>>>>
>>>>> goback.
>>>>>
>>>>> xml-handler section.
>>>>> evaluate XML-EVENT
>>>>> * ==> Order XML events most frequent first
>>>>> when 'START-OF-ELEMENT'
>>>>> display 'Start element tag: <' XML-TEXT '>'
>>>>> move XML-TEXT to current-element
>>>>> when 'CONTENT-CHARACTERS'
>>>>> display 'Content characters: <' XML-TEXT '>'
>>>>> * ==> Transform XML content to operational COBOL data item...
>>>>> evaluate current-element
>>>>> when 'listprice'
>>>>> * ==> Using function NUMVAL-C...
>>>>> compute list-price = function numval-c(XML-TEXT)
>>>>> when 'discount'
>>>>> compute discount = function numval-c(XML-TEXT)
>>>>> end-evaluate
>>>>
>>>> when 'END-OF-ELEMENT'
>>>>> display 'End element tag: <' XML-TEXT '>'
>>>>> move spaces to current-element
>>>>> when 'START-OF-DOCUMENT'
>>>>> compute xml-document-length = function
> length(XML-TEXT)
>>>>> display 'Start of document: length='
>> xml-document-length
>>>>> ' characters.'
>>>>> when 'END-OF-DOCUMENT'
>>>>> display 'End of document.'
>>>>> when 'VERSION-INFORMATION'
>>>>> display 'Version: <' XML-TEXT '>'
>>>>> when 'ENCODING-DECLARATION'
>>>>> display 'Encoding: <' XML-TEXT '>'
>>>>> when 'STANDALONE-DECLARATION'
>>>>> display 'Standalone: <' XML-TEXT '>'
>>>>>
>>>> when 'ATTRIBUTE-NAME'
>>>>> display 'Attribute name: <' XML-TEXT '>'
>>>>> when 'ATTRIBUTE-CHARACTERS'
>>>>> display 'Attribute value characters: <' XML-TEXT '>'
>>>>> when 'ATTRIBUTE-CHARACTER'
>>>>> display 'Attribute value character: <' XML-TEXT '>'
>>>>> when 'START-OF-CDATA-SECTION'
>>>>> display 'Start of CData: <' XML-TEXT '>'
>>>>> when 'END-OF-CDATA-SECTION'
>>>>> display 'End of CData: <' XML-TEXT '>'
>>>>> when 'CONTENT-CHARACTER'
>>>>> display 'Content character: <' XML-TEXT '>'
>>>>> when 'PROCESSING-INSTRUCTION-TARGET'
>>>>> display 'PI target: <' XML-TEXT '>'
>>>>> when 'PROCESSING-INSTRUCTION-DATA'
>>>>> display 'PI data: <' XML-TEXT '>'
>>>>> when 'COMMENT'
>>>>> display 'Comment: <' XML-TEXT '>'
>>>>> when 'EXCEPTION'
>>>>> compute xml-document-length = function length
>> (XML-TEXT)
>>>>> display 'Exception ' XML-CODE ' at offset '
>>>>> xml-document-length '.'
>>>>> when other
>>>>> display 'Unexpected XML event: ' XML-EVENT '.'
>>>>> end-evaluate
>>>>> .
>>>>> End program xmlsampl2.
>>>>>
>>>>> There is a CCSID-Option in ILE COBOL compiler too. After the
> compiling
>>>>> with the command
>>>>>
>>>>> CRTBNDCBL PGM(EBKPGMP/XMLSAMPL2)
>>>>> SRCFILE(RM/XMLSRC) SRCMBR(XMLSAMPL2)
>>>>> OPTION(*SOURCE *APOST) DBGVIEW(*SOURCE) ACTGRP(*CALLER)
>>>>> CCSID(819)
>>>>>
>>>>> (or without C
>>>>> CSID option) the program runs without exception, but the
>>>>> output is hieroglyphics (false encoding) e.g.:
>>>>>
>>>>> Start element tag: <Ë/>???ÄÇ>
>>>>> Content characters: < >
>>>>> Start element tag: <Â?Á/?>
>>>>> Attribute name: <?`?Á>
>>>>> Attribute value characters: <Â/,Á?>
>>>>> Attribute value character: <
>>>>> Attribute value characters: <Ë ÂÁË?>
>>>>>
>>>>> I don't know how to fix this problem..
>>>>>
>>>>> I spoked with the IBM support too. At present it seems so, that XML
>>>> PARSE
>>>>> statement in ILE COBOL has problems with encodings, it works
probably
>>>> only
>>>>> with CCSID=819.
>>>>>
>>>>> My opinion is, that the XML PARSE in ILE COBOL V5R3 statement is
>>>> presently
>>>>> not fit for production use.
>>>>>
>>>>> Have you other experience with XML PARSE statement in ILE COBOL V5R3
> ?
>>>>> --
>>>>> This is the COBOL Programming on the iSeries/AS400 (COBOL400-L)
>> mailing
>>>>> list
>>>>> To post a message email: COBOL400-L@xxxxxxxxxxxx
>>>>> To subscribe, unsubscribe, or change list options,
>>>>> visit: http://lists.midrange.com/mailman/listinfo/cobol400-l
>>>>> or email: COBOL400-L-request@xxxxxxxxxxxx
>>>>> Before posting, please take a moment to review the archives
>>>>> at http://archive.midrange.com/cobol400-l.
>>>>>
>>>>
>>>> --
>>>> This is the COBOL Programming on the iSeries/AS400 (COBOL400-L)
> mailing
>>>> list
>>>> To post a message email: COBOL400-L@xxxxxxxxxxxx
>>>> To subscribe, unsubscribe, or change list options,
>>>> visit: http://lists.midrange.com/mailman/listinfo/cobol400-l
>>>> or email: COBOL400-L-request@xxxxxxxxxxxx
>>>> Before posting, please take a moment to review the archives
>>>> at http://archive.midrange.com/cobol400-l.
>>>>
>>>>
>>>> --
>>>> This is the COBOL Programming on the iSeries/AS400 (COBOL400-L)
> mailing
>>>> list
>>>> To post a mes
> sage email: COBOL400-L@xxxxxxxxxxxx
>>>> To subscribe, unsubscribe, or change list options,
>>>> visit: http://lists.midrange.com/mailman/listinfo/cobol400-l
>>>> or email: COBOL400-L-request@xxxxxxxxxxxx
>>>> Before posting, please take a moment to review the archives
>>>> at http://archive.midrange.com/cobol400-l.
>>>>
>>>
>>> --
>>> This is the COBOL Programming on the iSeries/AS400 (COBOL400-L)
mailing
>>> list
>>> To post a message email: COBOL400-L@xxxxxxxxxxxx
>>> To subscribe, unsubscribe, or change list options,
>>> visit: http://lists.midrange.com/mailman/listinfo/cobol400-l
>>> or email: COBOL400-L-request@xxxxxxxxxxxx
>>> Before posting, please take a moment to review the archives
>>> at http://archive.midrange.com/cobol400-l.
>>>
>>>
>>> --
>>> This is the COBOL Programming on the iSeries/AS400 (COBOL400-L)
mailing
>>> list
>>> To post a message email: COBOL400-L@xxxxxxxxxxxx
>>> To subscribe, unsubscribe, or change list options,
>>> visit: http://lists.midrange.com/mailman/listinfo/cobol400-l
>>> or email: COBOL400-L-request@xxxxxxxxxxxx
>>> Before posting, please take a moment to review the archives
>>> at http://archive.midrange.com/cobol400-l.
>>>
>>
>> --
>> This is the COBOL Programming on the iSeries/AS400 (COBOL400-L) mailing
>> list
>> To post a message email: COBOL400-L@xxxxxxxxxxxx
>> To subscribe, unsubscribe, or change list options,
>> visit: http://lists.midrange.com/mailman/listinfo/cobol400-l
>> or email: COBOL400-L-request@xxxxxxxxxxxx
>> Before posting, please take a moment to review the archives
>> at http://archive.midrange.com/cobol400-l.
>>
>>
>> --
>> This is the COBOL Programming on the iSeries/AS400 (COBOL400-L) mailing
>> list
>> To post a message email: COBOL400-L@xxxxxxxxxxxx
>> To subscribe, unsubscribe, or change list options,
>> visit: http://lists.midrange.com/mailman/listinfo/cobol400-l
>> or email: COBOL400-L-request@xxxxxxxxxxxx
>> Before posting, please take a moment to review the archives
>> at http://archive.midrange.com/cobol400-l.
>>
>
> --
> This is the COBOL Programming on the iSeries/AS400 (COBOL400-L) mailing
> list
> To post a message email: COBOL400-L@xxxxxxxxxxxx
> To subscribe, unsubscribe, or change list options,
> visit: http://lists.midrange.com/mailman/listinfo/cobol400-l
> or email: COBOL400-L-request@xxxxxxxxxxxx
> Before posting, please take a moment to review the archives
> at http://archive.midrange.com/cobol400-l.
>
>
> --
> This is the COBOL Programming on the iSeries/AS400 (COBOL400-L) mailing
> list
> To post a message email: COBOL400-L@xxxxxxxxxxxx
> To subscribe, unsubscribe, or change list options,
> visit: http://lists.midrange.com/mailman/listinfo/cobol400-l
> or email: COBOL400-L-request@xxxxxxxxxxxx
> Before posting, please take a moment to review the archives
> at http://archive.midrange.com/cobol400-l.
>
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.