× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



                                                                        
   D* URL Escape an EBCDIC string.  Returns an EBCDIC escaped string, but
    * per the standard, the hex codes are actually the ASCII codes      
   D  HTTPEncode     pr         65535    varying                        
   D  iFrom                     65535    varying options(*varsize) const

   I've written the above as a service program, but it just seems like a
   problem waiting to happen as soon as one wants to encode more than 64K
   worth of data.  In fact, since the output data needs to get larger
   (generally speaking), the case where the iFrom field is close to full will
   likely cause the result to likely overflow.  In fact, the worst case is
   that the output of the function must return three times the number of
   bytes as the input buffer.

   I've considered passing in a pointer and length, which I don't really
   mind, but passing a return pointer has me a bit bothered.  Only the
   routine would know the correct return buffer length, and I'm concerned
   that having the HTTPEncode routine allocate memory is just a really nice
   way to leak a lot of memory, as I'm sure the callers of the routine will
   forget to DEALLOCate the memory when they are through with it.

   Is there a 'proper' solution to writing functions that must return an
   arbitrarily large buffer?

   Thanks!

   Regards,
   Rich

   Here's the whole module, if that helps:

        H 
   Nomain                                                                       
              
        H copyright('(c) 2003, Western Midrange Corp.  All Rights
   Reserved.')                         
                                                                                
                      
         * These characters require no
   conversion                                                     
        D  NoConv         s              1A   DIM(72) PERRCD(36)
   CTDATA                               
                                                                                
                      
         * This is the EBCDIC to ASCII table data from table
   QTCPASC                                  
        D  EbcAsc         s              2A   DIM(256) PERRCD(32)
   CTDATA                              
                                                                                
                      
         * Handy for converting a character to its decimal
   ordinal                                     
         * or converting a decimal to a
   character                                                     
        D ord            
   ds                                                                          
        D dec                     1      2b
   0                                                         
        D char                    2     
   2A                                                           
                                                                                
                      
        D* URL Escape an EBCDIC string.  Returns an EBCDIC escaped string,
   but                        
         * per the standard, the hex codes are actually the ASCII
   codes                               
        D  HTTPEncode     pr         65535   
   varying                                                 
        D  iFrom                     65535    varying options(*varsize)
   const                         
                                                                                
                      
        P HTTPEncode      b                  
   export                                                  
        D HTTPEncode      pi         65535   
   varying                                                 
        D iFrom                      65535    varying options(*varsize)
   const                         
                                                                                
                      
        D result          s          65535   
   varying                                                 
        D i               s              9p
   0                                                         
        D n               s              9p
   0                                                         
        D fc              s             
   1                                                            
        
   /free                                                                        
                
             for i=1 to
   %len(iFrom);                                                                 
 
                 fc =
   %subst(iFrom:i:1);                                                           
   
                 n =
   %lookup(fc:NoConv);                                                          
    
                 if n >
   0;                                                                           
 
                     result = result +
   fc;                                                            
                
   else;                                                                        
        
                     if fc = '
   ';                                                                     
                         result = result +
   '+';                                                       
                    
   else;                                                                        
    
                         // Use the hex code for the _ASCII_
   character                                
                         dec = 0;   // prep hex
   conversion                                            
                         char = fc; // converts hex char in char
   to                                   
                                    // decimal value in
   dec                                           
                                    // dec is used as array index for ascii
   conv                      
                         result = result + '%' +
   EbcAsc(dec+1);                                       
                    
   endif;                                                                       
    
                
   endif;                                                                       
        
            
   endfor;                                                                      
            
           return
   result;                                                                      
       
        
   /end-free                                                                    
                
        P HTTPEncode     
   e                                                                           
   **CTDATA
   NoConv                                                                       
             
   ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789                                         
                      
   abcdefghijklmnopqrstuvwxyz*@._-$!'()                                         
                      
   **CTDATA
   EbcAsc                                                                       
             
   000102031A091A7F1A1A1A0B0C0D0E0F101112131A1A081A18191A1A1C1D1E1F             
                      
   1A1A1C1A1A0A171B1A1A1A1A1A0506071A1A161A1A1E1A041A1A1A1A14151A1A             
                      
   20A6E180EB909FE2AB8B9B2E3C282B7C26A9AA9CDBA599E3A89E21242A293B5E             
                      
   2D2FDFDC9ADDDE989DACBA2C255F3E3FD78894B0B1B2FCD6FB603A2340273D22             
                      
   F861626364656667686996A4F3AFAEC58C6A6B6C6D6E6F7071729787CE93F1FE             
                      
   C87E737475767778797AEFC0DA5BF2F9B5B6FDB7B8B9E6BBBCBD8DD9BF5DD8C4             
                      
   7B414243444546474849CBCABEE8ECED7D4A4B4C4D4E4F505152A1ADF5F4A38F             
                      
   5CE7535455565758595AA0858EE9E4D130313233343536373839B3F7F0FAA7FF             
                      

As an Amazon Associate we earn from qualifying purchases.

This thread ...

Follow-Ups:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 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.