Forward Declarations

hi all,
can anyone explain me abt forward declarations in PLSQL

Forward Declaration:
A forward declaration consists of a subprogram spec terminated by a semicolon.
SQL> declare
  2   procedure proc1(p1 varchar2);--Forward
  3   procedure proc2 is
  4   begin
  5     proc1('Hai');--Used here without defining
  6   end;
  7   procedure proc1(p1 varchar2) is[b]--defined here
  8   begin
  9    dbms_output.put_line(p1);
10   end;
11  begin
12   proc2;
13  end;
14  /
Hai
PL/SQL procedure successfully completed.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

Similar Messages

  • Forward Declaration in Class Builder

    Hi All,
       In the Class Builder (SE24)when i create a new Class, There is an option of Forward declaration  in the Property Tab. In this, we can add Type Group Interface and Class. What is the Purpose of this forward declaration?
      The F1 help does not provide any help.
    Regards,
    Kapil.

    in addition to above replies, it can be used for classes and interfaces in that case Forward declaration is equivalent to
    CLASS <class_name> DEFINITION LOAD.
    interface <interface_name> load
    statements which are normally used in Program ( case for local classes )
    use of Load from SAP docu
    ... LOAD
    Effect
    The variant with the LOAD addition loads a global class class from the Class Library. This statement was needed before Release 6.20 if you wanted to access one of the static components of class from within a program, or to declare an event handler for class before class had been loaded automatically. From Release 6.20 onwards, the LOAD addition is only needed if the compilation of an ABAP program fails because it includes recursive accesses of a globa l class. In such cases, you may be able to make the program compilable by explicitly loading the class before recursion.
    Thanks,
    kranthi.

  • Forward Declaration and "this" keyword

    Consider this code:
    class A {
       private int i = 2 * this.j;  // This will be calculated as 2 * 0 = 0
    //   private int i = 2 * j;  //This code will not compile
       private int j = 20;
    }Why the "this" keyword is required for the j to be accessible? Though it is a forward declaration, what is the significance of "this" which gives visibility to the variable j. Please give some light to this.

    Though it is a forward declaration, what is the significance of "this" which gives
    visibility to the variable jI don't think "this" alters the visibility of j: that is the instance variable j is in scope. However "Use of instance variables whose declarations appear textually after the use is sometimes restricted, even though these instance variables are in scope."
    See "8.3.2.3 Restrictions on the use of Fields during Initialization" http://java.sun.com/docs/books/jls/third_edition/html/classes.html#287410
    Using "this" you have a reference to the object being constructed with the j instance variable sill having its default value of zero.
    Such instance initialisers would appear to be inherently less intelligible than using a constructor.

  • Use of forward declaration

    Hi Experts,
                   Please let me know the use of forward declaration for a class. How to use that?
    Thanks and Regards,
    Debarshi

    Hi,
    Absolutely true matt...
    you use forward declaration when you want to indicate that this component will be defined later but i am referring to this as of now.
    so that it does not give any syntax/ run time error.
    Rgds/Abhi

  • Package forward declaration

    Can anyone kindly explain me in detail about Package forward declaration and where this is used and what's the purpose of using it.A example would be good
    Thanks in advance

    A subprogram declaration called a
    forward declaration. It consists of the subprogram
    specification in the package body .
    CREATE OR REPLACE PACKAGE BODY declare_forward
    IS
    PROCEDURE pro(. . .);      -- forward declaration
    PROCEDURE pro2(. . .)
    IS                         -- subprograms defined
    BEGIN           -- in alphabetical order
    pro(. . .);
    END;
    END declare_forward;

  • Forward declaration concept

    hi,
    i have a package
    CREATE OR REPLACE PACKAGE BODY pkgemp AS
    FUNCTION fNeedsCpeReview(
    p_order_id IN VARCHAR2 DEFAULT NULL)
    RETURN product_info_tbl
    is
    CURSOR csr_ord_control IS
    SELECT action_cd
    FROM ord_control
    WHERE order_id = l_order_id;
    begin
    select * from abc where enum=1234;
    execute immediate create table abc(
    enum number);
    END pkgemp;
    -- please forget abt the function and cursor.
    -- the table 'abc' is not present in the DB
    -- so we cannot execute select statement and compilation error even though we are creatign that table after 'select' statement
    -- we need to do forward declarartion.
    my question is how do we do a forward declaration for creating a table ?

    Hi,
    Creating tables in procedures is rarely necessary in Oracle.
    Describe what you're trying to do, and someone will suggest a good way to do it. Many people have used global temporary tables where they thought creating a table on the fly was necessary.
    If you really do have to use table (abc) that may not exist at compile time, or if abc may be dropped and recreated after the procedure is compiled, then do everything that involves abc using dynamic SQL.
    Remember that EXECUTE IMMEDIATE works on strings, so
    execute immediate create table abc(
    enum number);is incorrect, but
    execute immediate 'create table abc(
                                       enum number)';will work.

  • No logical forward declared in action {0} in Web Channel

    Hello
    We are getting this error (No logical forward declared in action ) in CRM Web Channel when we are trying to retrieve a service order.
    Any Ideas????

    Hello,
    I would guess that this maybe due to come config in your struts-config.xml
    I would check the f tansaction type that is been used and the transaction category
    The only transaction category working with ICSS are:                                   
    - BUS2000116                                                                       
    - BUS2000120                                                                       
    - BUS2000112                  
    Regards
    Mark

  • Receiving the warning of class forward declaration

    I am trying to build the Clustering Plug in project on my Leopard. I have following 2 queries -
    In that project an interface class is defined as
    @interface ClusteringController : NSWindowController { ....... ..... .... } @end.
    And this class is used in implementation class using forward declaration as follows
    @class ClusteringController;
    then in one fuction it is used as follows
    (long) filterImage:(NSString*) menuName {
    ClusteringController *cluster = [[ClusteringController alloc] init]; [cluster showWindow:self]; return 0; }
    When i try to build this project it showing a warning as follows
    warning: receiver 'ClusteringController' is a forward class and corresponding @interface may not exist
    Also there is 1 more warning is coming
    warning: no '-updateProxyWhenReconnect' method found
    This warning is coming for the following line of code
    if(delegate) [delegate updateProxyWhenReconnect];
    Can anybody help me to overcome these warnings?

    shaktirsg wrote:
    And this class is used in implementation class using forward declaration as follows
    @class ClusteringController;
    An implementation requires an #import of the entire interface file for any class used in the code. As a rule:
    Use @class when a class is used in an @interface
    Use #import when a class is used in an @implementation
    if(delegate) \[delegate updateProxyWhenReconnect\];
    warning: no '- updateProxyWhenReconnect' method found
    It looks like the compiler doesn't know the class of 'delegate'. Can we see the code that sets the 'delegate' variable? Also please let us know where updateProxyWhenReconnect is declared. Is it declared in the interface for the class to which 'delegate' belongs? If so, it might be good for us to also see that @interface file.
    \- Ray

  • PLS-00323 forward declaration in PLSQL Version 10.

    Hello.
    I have a package which contains forward references which compiles on a 9i database.
    However, when I try to compile an exact copy of the procedure on a 10g database it returns an error
    "PLS-00323: subprogram or cursor 'P_PA_ACTION_START' is declared in a package specification and must be defined in the package body"
    I was wondering if there were any differences in the rules concerning forward references in pl/sql 10.
    Thanks in advance.
    Glyn Williams.

    Hello.
    I have a package which contains forward references which compiles on a 9i database.
    However, when I try to compile an exact copy of the procedure on a 10g database it returns an error
    "PLS-00323: subprogram or cursor 'P_PA_ACTION_START' is declared in a package specification and must be defined in the package body"
    I was wondering if there were any differences in the rules concerning forward references in pl/sql 10.
    Thanks in advance.
    Glyn Williams.

  • Filter Coding Issues

    I've been following (roughly) the simple virus scanner interface that SUN provides, and adapted it into a slightly heavier weight filter that interfaces with libclamav. At first both were compiled using GCC, and I thought due to some of the weird problems I had when debugging flags were inserted, maybe Sun Studio would give better results. It hasn't, and I'm at a bit of a loss as to what to do next.
    The symptom is that parts of the message just dissapear, and I see the old mime boundaries within the message body, so it seems like there's some pointer indicating where the message starts that's being corrupted by something in my code.
    Interestingly, if I stop processing the message while still inside the headers, there is no problem, but that's not a very effective virus scanner if it can only look at the content type and filename of the part now is it?
    This happens regardless of whether I use GCC or CC, and I'm using 0.88.1 of clamav. The output message is shown last. It should be fairly obvious what's wrong with it.
    Here's my code, perhaps someone can tell me what I'm doing wrong.
    ** WARNING ** This IS NOT polished code, so please don't expect it to be perfect. It's clean, but includes absolute pathnames, and some other nauties that should be removed before anyone even thinks of reusing this. Once it actually works, I'll do the nessisary code cleanup, and release this to the community to do whatever anyone wants with.
    Makefile
    SERVER_ROOT=/opt/SUNWmsgsr
    INSTALL_LOCATION=/var/opt/SUNWmsgsr/site-programs/
    INCLUDE=-I${SERVER_ROOT}/include
    LIBPATH=-L${SERVER_ROOT}/lib
    CLAMLIBS=`/usr/local/bin/clamav-config --libs` -lclamav
    CLAMFLAGS=`/usr/local/bin/clamav-config --cflags`
    LIBS=-lmtasdk ${CLAMLIBS}
    FLAGS=${CLAMFLAGS}
    all:
            cc ${FLAGS} -o msgsr_clamav msgsr_clamav.c \
                    ${INCLUDE} ${LIBPATH} ${LIBS}
    install:
            cp msgsr_clamav ${INSTALL_LOCATION}
            cp msgsr_clamav.cnf ${INSTALL_LOCATION}************************************************
    Expansions
    CLAMLIBS=-L/usr/local/lib -lz -lbz2 -lpthread -lclamav
    CLAMFLAGS=-I/usr/local/include -xO4************************************************
    msgsr_clamav.c
    * msgsr_clamav
    * Interface the Sun Java System Message Server with LibClamAV
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <pthread.h>
    #include "clamav.h"     // LibClamAV Header
    #include "mtasdk.h"
    * A structure to store channel options
    typedef struct {
         /* Produce debug output? */
         int debug;
         // Maximum size (in bytes) attachment to scan
         int scan_maxsize;
         // Scan recursion level
         int scan_recursion_level;
         // Max files
         int scan_maxfiles;
         // Path to ClamAV Virus Database
         char db_dir[BIGALFA_SIZE+3];
         // Used Internally by ClamAV. Stored here for ease of access
         struct cl_node *root;
         unsigned int signo;
         struct cl_stat dbstat;
         pthread_mutex_t reload_mutex;
         // MIME types to ignore
         char ignore_mime_types[BIGALFA_SIZE+3];
         // Types of files to ignore
         char ignore_file_types[BIGALFA_SIZE+3];
         /* Unwanted MIME content types (ALWAYS stripped, never scanned) */
         char bad_mime_types[BIGALFA_SIZE+3];
         /* Unwanted file types (ALWAYS stripped, never scanned)*/
         char bad_file_types[BIGALFA_SIZE+3];
         /* Length of bmt string */
         size_t bmt_len;
         /* Length of bft string */
         size_t bft_len;
    } our_options_t;
    // A structure passed per message to contain message specific data, including open files, etc.
    typedef struct {
         // The filename of the temp file in use so it can be unlinked when we're done with it.
         char temp_file_name[BIGALFA_SIZE * 2 + 10];
         // The file * to the temp file in use, so we don't have to reopen it across calls to decode_inspect
         FILE *temp_file;
         // A pointer to the single instance of our_options_t that is shared across all threads
         our_options_t * options;
    } msg_temp_data_t;
    * Forward declarations
    static void error_exit(int ires, const char *msg);
    static void error_report(our_options_t *options, int ires, const char *func);
    static void error_reports(our_options_t *options, const char* errStr, const char *func);
    static int is_bad_mime_type(our_options_t *options, mta_decode_t *dctx, char *buf, size_t maxbuflen);
    static int is_bad_file_type(our_options_t *options, mta_opt_t *params, const char *param_name, char *buf, size_t maxbuflen);
    static int load_options(our_options_t *options);
    static mta_dq_process_message_t process_message;
    static mta_decode_read_t decode_read;
    static mta_decode_inspect_t decode_inspect;
    * main() -- Initialize the MTA SDK, load our options, and then
    * start the message processing loop.
    int main()
         int ires,ret;
         char error_msg[BIGALFA_SIZE+3];
         our_options_t options;
         * Initialize the MTA SDK
         * See explanatory comment 1
         if ((ires = mtaInit(0)))
              error_exit(ires, "Unable to initialize the MTA SDK");
         * Load our channel options
         * See explanatory comment 2
         if ((ires = load_options(&options)))
              error_exit(ires, "Unable to load our channel options");
         * Initialize the ClamAV Virus Engine and Database
         // Preconditions to initializing the ClamAV database
         options.root=NULL; options.signo=0;
         // Load the virus database
         mtaLog("cl_loaddbdir() loading database from %s",options.db_dir);
         if ((ret = cl_loaddbdir(options.db_dir, &options.root, &options.signo)))
              sprintf(error_msg,"cl_loaddbdir() error: %s", cl_strerror(ret));
              error_exit(MTA_NO,error_msg);
         mtaLog("cl_loaddbdir() loaded %d virus definitions",options.signo);
         // Internalize the virus database structure
         mtaLog("cl_build() initializing database");
         if((ret = cl_build(options.root)))
              sprintf(error_msg,"cl_build() error: %s", cl_strerror(ret));
              error_exit(MTA_NO,error_msg);
         // Keep track of database updates
         memset(&options.dbstat, 0, sizeof(struct cl_stat));
         cl_statinidir(options.db_dir, &options.dbstat);
         // Initialize our reload mutex
         if (ret = pthread_mutex_init(&options.reload_mutex,NULL))
              sprintf(error_msg,"pthread_mutex_init() error: %d", ret);
              error_exit(MTA_NO,error_msg);
         * Now process the queued messages. Be sure to indicate a
         * thread stack size sufficient to accomodate message
         * enqueue processing.
         * See explanatory comment 3
         if ((ires = mtaDequeueStart((void *)&options,
         process_message, NULL, 0)))
         error_exit(ires, "Error during dequeue processing");
         * All done
         cl_free(options.root);
         mtaDone();
         return(0);
    *Reloads the virus database and re-initializes the in memory structure
    * Loads a new virus database, then if all succeeds, it
    * swaps the new database with the old one.  It's assumed
    * clamav releases the database gracefully, but another mutex
    * may be required if this is not the case.
    static int reload_database(our_options_t *options)
         struct cl_node *newroot = NULL,*oldroot;
         char error_msg[BIGALFA_SIZE+3];
         int ret;
         unsigned int signo=0;
         if (pthread_mutex_trylock(&options->reload_mutex)) {     // Only one reload at a time thank you.
              if(cl_statchkdir(&options->dbstat) == 1) {     // Make sure we actually need an update
                   mtaLog("reload_database() Virus database is stale... reloading");
                   mtaLog("cl_loaddbdir() reloading database from %s",options->db_dir);
                   // Load the new virus database
                   if ((ret = cl_loaddbdir(options->db_dir, &newroot, &signo)))
                        mtaLog("cl_loaddbdir() error: %s", cl_strerror(ret));
                        return (-1);
                   mtaLog("cl_loaddbdir() loaded %d virus definitions",options->signo);
                   // Internalize the virus database structure
                   mtaLog("cl_build() re-initializing database");
                   if((ret = cl_build(newroot)))
                        mtaLog("cl_build() error: %s", cl_strerror(ret));
                        mtaLog("reload_database() Database reload aborted");
                        cl_free(newroot);
                        return (-2);
                   // Save a pointer to the old root
                   oldroot = options->root;
                   // Swap in the new root and signo
                   options->root = newroot;
                   options->signo = signo;
                   // Release the old root
                   cl_free(oldroot);
                   mtaLog("database_reload() Successfully loaded new virus database");
                   // Keep track of database updates
                   cl_statfree(&options->dbstat);
                   cl_statinidir(options->db_dir, &options->dbstat);
              pthread_mutex_unlock(&options->reload_mutex);
    * process_message() -- This routine is called by
    * mtaDequeueStart() to process each queued
    * message. We don&#31258; make use of ctx2, but
    * ctx1 is a pointer to our channel options.
    * See explanatory comment 4
    static int process_message(void **ctx2, void *ctx1, mta_dq_t *dq, const char *env_from, size_t env_from_len)
         const char *adr;
         int disp, ires;
         size_t len;
         mta_nq_t *nq;
         msg_temp_data_t msg_data;
         * Initializations
         nq = NULL;
         msg_data.options = (our_options_t *)ctx1;
         msg_data.temp_file = NULL;
         * Check the virus database to make sure it isn't stale
         * If it it's not currently reloading, and is stale, reload it.
         //if(cl_statchkdir(&(msg_data.options->dbstat)) == 1)
         //     reload_database(msg_data.options);
         * A little macro to do error checking on mta*() calls
         #define CHECK(f,x) \
         if ((ires = x)) { error_report(msg_data.options, ires, f); goto \
              done_bad; }
         * Start a message enqueue. Use the dequeue context to copy
         * envelope flags fromt the current message to this new
         * message being enqueued.
         * See explanatory comment 5
         CHECK("mtaEnqueueStart", mtaEnqueueStart(&nq, env_from, env_from_len, MTA_DQ_CONTEXT, dq, 0));
         * Process the envelope recipient list
         * See explanatory comment 6
         while (!(ires = mtaDequeueRecipientNext(dq, &adr, &len, 0)))
              * Add this envelope recipient address to the message
              * being enqueued. Use the dequeue context to copy
              * envelope flags for this recipient from the current
              * message to the new message.
              ires = mtaEnqueueTo(nq, adr, len, MTA_DQ_CONTEXT,
              dq, MTA_ENV_TO, 0);
              /* See explanatory comment 7 */
              disp = (ires) ? MTA_DISP_DEFERRED : MTA_DISP_RELAYED;
              CHECK("mtaDequeueRecipientDisposition", mtaDequeueRecipientDisposition(dq, adr, len,disp, 0));
         * A normal exit from the loop occurs when
         * mtaDequeueRecipientNext() returns an MTA_EOF status.
         * Any other status signifies an error.
         if (ires != MTA_EOF)
              error_report(msg_data.options, ires, "mtaDequeueRecipientNext");
              goto done_bad;
         * Begin the MIME decode of the message
         * See explanatory comment 8
         CHECK("mtaDecodeMessage",
              mtaDecodeMessage(
              /* Private context is our message data structure */
              (void *)&msg_data,
              /* Input is the message being dequeued */
              MTA_DECODE_DQ, (void *)dq,
              /* Output is the message being enqueued */
              MTA_DECODE_NQ, (void *)nq,
              /* Inspection routine */
              decode_inspect,
              /* Convert non-MIME formats to MIME */
              MTA_DECODE_THURMAN,
              0));
         * Finish the enqueue
         * NOTE: IT&#25285; IMPORTANT TO DO THIS before DOING THE
         * DEQUEUE. YOU WILL LOSE MAIL IF YOU DO THE DEQUEUE FIRST
         * and then THE ENQUEUE FAILS.
         * See explanatory text 9
         CHECK("mtaEnqueueFinish", mtaEnqueueFinish(nq, 0));
         nq = NULL;
         * Finish the dequeue
         CHECK("mtaDequeueFinish", mtaDequeueMessageFinish(dq, 0));
         * All done with this message
         return(MTA_OK);
    done_bad:
         * Abort any ongoing enqueue or dequeue
         if (nq)
              mtaEnqueueFinish(nq, MTA_ABORT, 0);
         if (dq)
              mtaDequeueMessageFinish(dq, MTA_ABORT, 0);
         * And return our error status
         return(ires);
    #undef CHECK
    * decode_inspect() -- This is the routine that inspects each
    * message part, deciding whether to accept
    * or reject it.
    * See explanatory comment 10
    static int decode_inspect(void *ctx, mta_decode_t *dctx, int data_type,const char *data, size_t data_len)
         char buf[BIGALFA_SIZE * 2 + 10];
         const char *virname;
         int i;
         static unsigned int part_c = 1;
         msg_temp_data_t *msg_data = (msg_temp_data_t *)ctx;
         strncpy(buf,data,data_len);
         buf[data_len] = 0;
         mtaLog("decode_inspect() (%d,%ud): %s",data_type,dctx,buf);
         switch (data_type)
              case MTA_DATA_HEADER:
              * See if the part has:
              * 1. A bad MIME content-type,
              * 2. A bad file name extension in the (deprecated)
              * NAME= content-type parameter, or
              * 3. A bad file name extension in the
              * FILENAME= content-disposition parameter.
              i = 0;
              if ((i = is_bad_mime_type((void *)msg_data->options, dctx, buf, sizeof(buf))) ||
                   is_bad_file_type((void *)msg_data->options,mtaDecodeMessageInfoParams(dctx,MTA_DECODE_CTYPE_PARAMS, NULL),"NAME", buf, sizeof(buf)) ||
                   is_bad_file_type((void *)msg_data->options,mtaDecodeMessageInfoParams(dctx,MTA_DECODE_CDISP_PARAMS, NULL),"FILENAME", buf, sizeof(buf)))
                   char msg[BIGALFA_SIZE*4 + 10];
                   * Replace this part with a text message indicating
                   * that the part&#30196; content has been deleted.
                   * See explanatory comment 11
                   if (i)
                        i = sprintf(msg,
                             "The content of this message part has been removed.\n"
                             "It contained a potentially harmful media type of %.*s",
                             strlen(buf)-2, buf+1);
                   else
                        i = sprintf(msg,
                             "The content of this message part has been removed.\n"
                             "It contained a potentially harmful file named '%s'", buf);
                   mtaLog("decode_inspect(): %s",msg);
                   return(mtaDecodeMessagePartDelete(dctx,
                        MTA_REASON, msg, i,
                        MTA_DECODE_CTYPE, "text", 4,
                        MTA_DECODE_CSUBTYPE, "plain", 5,
                        MTA_DECODE_CCHARSET, "us-ascii", 8,
                        MTA_DECODE_CDISP, "inline", 6,
                        MTA_DECODE_CLANG, "en", 2, 0));
              } break; // case MTA_DATA_HEADER:
              case MTA_DATA_TEXT:
              case MTA_DATA_BINARY:
                   if (msg_data->temp_file == NULL)
                        sprintf(msg_data->temp_file_name,"/tmp/%i.tmp",part_c++);
                        mtaLog("messageDecode(): Opening Temp File %s",msg_data->temp_file_name);
                        msg_data->temp_file = fopen(msg_data->temp_file_name,"wb");
                   fwrite(data,data_len,1,msg_data->temp_file);
                   return(MTA_OK);
                   break;
              case MTA_DATA_NONE:
                   fflush(msg_data->temp_file);
                   fclose(msg_data->temp_file);
                   msg_data->temp_file = NULL;
                   struct cl_limits limits;
                   memset(&limits, 0, sizeof(struct cl_limits));
                   /* maximal number of files in archive */;
                   limits.maxfiles = 1000;
                   /* maximal archived file size */
                   limits.maxfilesize = 10 * 1048576; /* 10 MB */
                   /* maximal recursion level */
                   limits.maxreclevel = 5;
                   /* maximal compression ratio */
                   limits.maxratio = 200;
                   /* disable memory limit for bzip2 scanner */
                   limits.archivememlim = 0;
                   i = cl_scanfile(msg_data->temp_file_name, &virname, NULL, msg_data->options->root,&limits,CL_SCAN_STDOPT);
                   unlink (msg_data->temp_file_name);
                   if(i == CL_VIRUS) {
                        char msg[BIGALFA_SIZE*4 + 10];
                        size_t idlen;
                        i = sprintf(msg,
                             "The content of this message part has been removed.\n"
                             "It contained the virus %s in a file named '%s'", virname,buf);
                        mtaDequeueInfo(dctx,MTA_ENV_ID,&buf,&idlen);
                        buf[idlen] = '\0';
                        mtaLog("decode_inspect(): Detected %s virus in part %i of msg ID %s",virname,0,buf);
                        return(mtaDecodeMessagePartDelete(dctx,
                             MTA_REASON, msg, i,
                             MTA_DECODE_CTYPE, "text", 4,
                             MTA_DECODE_CSUBTYPE, "plain", 5,
                             MTA_DECODE_CCHARSET, "us-ascii", 8,
                             MTA_DECODE_CDISP, "inline", 6,
                             MTA_DECODE_CLANG, "en", 2, 0));
                   } else {
                        if(i != CL_CLEAN)
                             mtaLog("decode_inspect() Error: %s scanning file %s",cl_strerror(i),msg_data->temp_file_name);
                        else
                             mtaLog("decode_inspect(): Part in file %s is clean",msg_data->temp_file_name);
                        //return(mtaDecodeMessagePartCopy(dctx, 0));
                        return(MTA_OK); break;
         return(MTA_OK);
    * is_bad_mime_type() -- See if the part&#30196; media type is in our
    * bad MIME content types, for example:
    * application/vbscript
    * See explanatory comment 13
    static int is_bad_mime_type(our_options_t *options,
    mta_decode_t *dctx, char *buf,
    size_t maxbuflen)
         const char *csubtype, *ctype;
         size_t i, len1, len2;
         char *ptr;
         * Sanity checks
         if (!options || !options->bmt_len ||
              !options->bad_mime_types[0] ||
              !dctx)
              return(0);
         * Get the MIME content type
         ctype = mtaDecodeMessageInfoString(dctx, MTA_DECODE_CTYPE,NULL, &len1);
         csubtype = mtaDecodeMessageInfoString(dctx,MTA_DECODE_CSUBTYPE,NULL, &len2);
         * Build the string: <0x01>type/subtype<0x01><0x00>
         ptr = buf;
         *ptr++ = (char)0x01;
         for (i = 0; i < len1; i++)
              *ptr++ = tolower(*ctype++);
         *ptr++ = '/';
         for (i = 0; i < len2; i++)
              *ptr++ = tolower(*csubtype++);
         *ptr++ = (char)0x01;
         *ptr = '\0';
         * Now see if the literal just built occurs in the list of
         * bad MIME content types
         return((strstr(options->bad_mime_types, buf)) ? -1 : 0);
    * is_bad_file_type() -- See if the part has an associated file
    * name whose file extension is in our list
    * of bad file names, such as .vbs.
    * See explanatory comment 14
    static int is_bad_file_type(our_options_t *options,
    mta_opt_t *params,
    const char *param_name, char *buf,
    size_t maxbuflen)
         const char *ptr1;
         char fext[BIGALFA_SIZE+2], *ptr2;
         size_t i, len;
         * Sanity checks
         if (!options || !options->bft_len || !params || !param_name)
              return(0);
         len = 0;
         buf[0] = '\0';
         if (mtaOptionString(params, param_name, 0, buf, &len,
              maxbuflen - 1) ||
              !len || !buf[0])
              * No file name parameter specified
              return(0);
         * A file name parameter was specified. Parse it to
         * extract the file extension portion, if any.
         ptr1 = strrchr(buf, '.');
         if (!ptr1)
              * No file extension specified
              return(0);
         * Now store the string created earlier in fext[]
         * Note that we drop the &#12539;&#12539;from the extension.
         ptr1++; /* Skip over the &#12539;&#12539;*/
         ptr2 = fext;
         *ptr2++ = (char)0x01;
         len = len - (ptr1 - buf);
         for (i = 0; i < len; i++)
              *ptr2++ = tolower(*ptr1++);
         *ptr2++ = (char)0x01;
         *ptr2++ = '\0';
         * Now return -1 if the string occurs in
         * options->bad_file_types.
         return((strstr(options->bad_file_types, fext)) ? -1 : 0);
    * load_options() -- Load our channel options from the channel&#30196;
    * option file
    * See explanatory comment 15
    static int load_options(our_options_t *options)
         char buf[BIGALFA_SIZE+1];
         size_t buflen, i;
         mta_opt_t *channel_opts;
         int ires;
         const char *ptr0;
         char *ptr1;
         * Initialize the our private channel option structure
         memset(options, 0, sizeof(our_options_t));
         * Set internal defaults for important features
         options->scan_maxsize = 10 * 1024 * 1024; // 10 MB
         options->scan_recursion_level = 10;
         options->scan_maxfiles = 200;
         strcpy(options->db_dir,cl_retdbdir()); // Default ClamAV Directory
         * Access the channel&#30196; option file
         * See explanatory comment 16
         channel_opts = NULL;
         if ((ires = mtaOptionStart(&channel_opts, "/var/opt/SUNWmsgsr/site-programs/msgsr_clamav.cnf", 0, 0)))
              mtaLog("Unable to access our channel option file");
              return(ires);
         * DEBUG=0|1
         options->debug = 0;
         mtaOptionInt(channel_opts, "DEBUG", 0, &options->debug);
         if (options->debug)
              mtaDebug(MTA_DEBUG_SDK, 0);
         * BAD_MIME_TYPES=type1/subtype1[,type2/subtype2[,...]]
         buf[0] = '\0';
         mtaOptionString(channel_opts, "BAD_MIME_TYPES", 0, buf,
         &buflen, sizeof(buf));
         * Now translate the comma separated list:
         * Type1/Subtype1[,Type2/Subtype2[,...]]
         * to
         *<0x01>type1/subtype1[<0x01>type2/subtype2[<0x01>...]]<0x01>
         ptr0 = buf;
         ptr1 = options->bad_mime_types;
         *ptr1++ = (char)0x01;
         for (i = 0; i < buflen; i++)
              if (*ptr0 != ',')
                   *ptr1++ = tolower(*ptr0++);
              else
                   *ptr1++ = (char)0x01;
                   ptr0++;
         *ptr1++ = (char)0x01;
         *ptr1 = '\0';
         options->bmt_len = ptr1 - options->bad_mime_types;
         * BAD_FILE_TYPES=["."]Ext1[,["."]Ext2[,...]]
         buf[0] = '\0';
         buflen = 0;
         mtaOptionString(channel_opts, "BAD_FILE_TYPES", 0, buf,
         &buflen, sizeof(buf));
         * Now translate the comma separated list:
         * ["."]Ext1[,["."]Ext2[,...]]
         * to
         * <0x01>ext1[<0x01>ext2[<0x01>...]]<0x01>
         ptr0 = buf;
         ptr1 = options->bad_file_types;
         *ptr1++ = (char)0x01;
         for (i = 0; i < buflen; i++)
              switch(*ptr0)
                   default : /* copy after translating to lower case */
                        *ptr1++ = tolower(*ptr0++);
                        break;
                   case '.' : /* discard */
                        break;
                   case ',' : /* end current type */
                        *ptr1++ = (char)0x01;
                        ptr0++;
                   break;
         *ptr1++ = (char)0x01;
         *ptr1 = '\0';
         options->bft_len = ptr1 - options->bad_file_types;
         * Dispose of the mta_opt_t context
         * See explanatory comment 17
         mtaOptionFinish(channel_opts);
         * And return a success
         return(MTA_OK);
    * error_report() &#12539;Report an error condition when debugging is
    * enabled.
    static void error_report(our_options_t *options, int ires,
    const char *func)
         if (options->debug)
              mtaLog("%s() returned %d; %s",
                   (func ? func : "?"), ires, mtaStrError(ires,0));
    static void error_reports(our_options_t *options, const char* errStr,
    const char *func)
         if (options->debug)
              mtaLog("%s() reported: %s",
                   (func ? func : "?"), errStr);
    * error_exit() -- Exit with an error status and error message.
    static void error_exit(int ires, const char *msg)
         mtaLog("%s%s%s", (msg ? msg : ""), (msg ? "; " : ""),
         mtaStrError(ires,0));
         exit(1);
    msgsr_clamav.cnf
    DEBUG=1
    BAD_MIME_TYPES=application/vbscript
    BAD_FILE_TYPES=bat,pif,vb,vbs,chs,exe************************************************
    broken message
    Return-path: <[email protected]>
    Received: from virusscan-daemon.apple.california.com by apple.california.com
    (Sun Java System Messaging Server 6.2-3.04 (built Jul 15 2005))
    id <[email protected]> for [email protected]; Thu,
    20 Apr 2006 07:30:13 -0700 (PDT)
    Received: from california.com ([209.159.129.16])
    by apple.california.com (Sun Java System Messaging Server 6.2-3.04 (built Jul
    15 2005)) with ESMTP id <[email protected]> for
    [email protected]; Thu, 20 Apr 2006 07:30:05 -0700 (PDT)
    Received: from [61.23.221.222] by apple.california.com (mshttpd); Thu,
    20 Apr 2006 14:30:05 +0000 (GMT)
    Content-return: allowed
    Date: Thu, 20 Apr 2006 14:30:05 +0000 (GMT)
    From: [email protected]
    Subject: Re: testing
    In-reply-to: <[email protected]>
    To: [email protected]
    Message-id: <[email protected]>
    MIME-version: 1.0
    X-Mailer: Sun Java(tm) System Messenger Express 6.2-3.04 (built Jul 15 2005)
    Content-type: multipart/alternative;
    boundary="Boundary_(ID_iOVR4MBjhWJn/mh7Ij+BUQ)"
    Content-language: en
    X-Accept-Language: en
    Priority: normal
    References: <[email protected]>
    Original-recipient: rfc822;[email protected]
    This is a multi-part message in MIME format.
    --Boundary_(ID_iOVR4MBjhWJn/mh7Ij+BUQ)
    Content-type: text/plain; charset=us-ascii
    Content-transfer-encoding: 7bit
    Content-disposition: inline
    Data is missing from here
    ----ec04832708e231d6e2f
    --Boundary_(ID_iOVR4MBjhWJn/mh7Ij+BUQ)
    Content-type: text/html; charset=us-ascii
    Content-transfer-encoding: quoted-printable
    Content-disposition: inline
    Data is missing from here
    nal Message -----=3Cbr=3EFrom=3A chales=40california=2Ecom=3Cbr=3EDate=3A=
    Thursday=2C April 20=2C 2006 11=3A19 pm=3Cbr=3ESubject=3A testing=3Cbr=3E=
    To=3A chales=40california=2Ecom=3Cbr=3E=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B=
    3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B 5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B=
    7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B 9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B=
    1=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B 3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B=
    5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B 7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B=
    9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B 1=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B=
    3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B 5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B=
    7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B 9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B=
    1=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B 3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B=
    5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B 7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B=
    9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B 1=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B=
    3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B 5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B=
    7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B 9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B=
    1=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B 3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B=
    5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B 7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B=
    9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B 1=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B=
    3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B 5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B=
    7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B 9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B=
    1=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B 3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B=
    5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B 7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B=
    9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B 1=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B=
    3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B 5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B=
    7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B 9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B=
    1=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B 3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B=
    5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B 7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B=
    9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B 1=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B=
    3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B 5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B=
    7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B 9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B=
    1=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B 3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B=
    5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B 7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B=
    9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B 1=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B=
    3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B 5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B=
    7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B 9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B=
    1=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B 3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B=
    5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B 7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B=
    9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B 1=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B=
    3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B 5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B=
    7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B 9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B=
    1=3Cbr=3E=26gt=3B 2=3Cbr=3E=26gt=3B 3=3Cbr=3E=26gt=3B 4=3Cbr=3E=26gt=3B=
    5=3Cbr=3E=26gt=3B 6=3Cbr=3E=26gt=3B 7=3Cbr=3E=26gt=3B 8=3Cbr=3E=26gt=3B=
    9=3Cbr=3E=26gt=3B 0=3Cbr=3E=26gt=3B =3Cbr=3E=26gt=3B
    ----ec04832708e231d6e2f
    --Boundary_(ID_iOVR4MBjhWJn/mh7Ij+BUQ)
    Content-type: text/x-vcard; name=chales.vcf; charset=us-ascii
    Content-transfer-encoding: base64
    Content-disposition: attachment; filename=chales.vcf
    Content-description: Card for <[email protected]>
    bA0KdGVsO3dvcms6NTEwLTI4Ny04NDUwDQp1cmw6aHR0cDovL3d3dy5jYWxpZm9ybmlh
    LmNvbS8NCm9yZzpDYWxpZm9ybmlhQ29tLCBJbmM7DQp2ZXJzaW9uOjIuMQ0KZW1haWw7
    aW50ZXJuZXQ6Y2hhbGVzQGNhbGlmb3JuaWEuY29tDQp0aXRsZTpTeXN0ZW0gQWRtaW5p
    c3RyYXRvcg0KZW5kOnZjYXJkDQo=
    ----ec04832708e231d6e2f--
    Boundary_(ID_iOVR4MBjhWJn/mh7Ij+BUQ)

    Ok, so it's not my code. Using the virus_scanner_simple.c example from SUN, if you change the decode_inspect routine to return MTA_OK for every call (which should technically just let the message pass) it has the same behavior as my program. (Not all that suprising since mine is a derivative of said program)
    That said, this now looks like a library issue. I'm using Sun Java System Messaging Server 6.2-3.04 (built Jul 15 2005) according to the SMTP prompt, and was wondering if perhaps I should apply:
    http://sunsolve.sun.com/search/document.do?assetkey=1-21-118207-42-1&searchclause=6306404
    The issue seems to be in the mtaDecodeMessage function, and occurs when the decode_inspect function is allowed to parse the message body, not just the message headers.
    The machine is a Sun Ultra 4500 running Solaris 10. Here's the banner:
    SunOS cookie 5.10 Generic_118822-23 sun4u sparc SUNW,Ultra-Enterprise
    Has anyone else had similar problems using the MTA SDK? Is there anything I'm missing here (besides the above mentioned patch) that might fix this?

  • How to call procedure inside a procedure and need to sore the value in a variable?

    HI ALL,
    i am usung oracle 11g.
    here is my package and procedure
    i want  to call get_email_details this procedure inside the process_email_master and want to keep the value inside a varible in master procedure
    create or replace
    PACKAGE        ms_gen_process_email
    as
       type email_type is record(subject                            varchar2(4000 char),
                                 email_body                       varchar2(4000 char),
                                 to_receipent                    varchar2(4000 char),
                                 cc_receipent                     varchar2(4000 char));
        type email_type_table is table of email_type;
       procedure process_email_master(
          p_metric_name     IN   VARCHAR2,
          p_current_stage   in   varchar2,
          p_action          in   varchar2,
          p_pid             in    number,
          P_OBJECT_ID       in    varchar2
          --p_emai_master     out   p_email_type_table
       PROCEDURE get_email_details (
          p_metric_name     IN   VARCHAR2,
          p_current_stage   in   varchar2,
          P_ACTION          in   varchar2,
          p_email_type_table1 out email_type_table
    END ms_gen_process_email;
    create or replace
    PACKAGE BODY        ms_gen_process_email
    as
        procedure process_email_master(
          p_metric_name     IN   VARCHAR2,
          p_current_stage   in   varchar2,
          p_action          in   varchar2,
          p_pid             in    number,
          p_object_id       in    varchar2
          as
          begin
          null;
           EXCEPTION
          WHEN OTHERS
          then
             null;
          end process_email_master;
       PROCEDURE get_email_details (
          p_metric_name     IN   VARCHAR2,
          p_current_stage   IN   VARCHAR2,
          P_ACTION          in   varchar2,
          p_email_type_table out email_type_table
       as
       BEGIN
          select subject, email_body, to_receipent, cc_receipent
           bulk collect into p_email_type_table
                    from ms_gen_email_config_detail
           WHERE email_key = (
                    SELECT email_key
                      FROM ms_gen_email_config
                     WHERE metric_name = p_metric_name
                       AND action = p_action
                       and current_stage = p_current_stage
          for i in p_email_type_table.first..p_email_type_table.last loop
          dbms_output.put_line(p_email_type_table(i).subject||p_email_type_table(i).email_body||p_email_type_table(i).to_receipent||p_email_type_table(i).cc_receipent);
          end loop;
       EXCEPTION
          WHEN OTHERS
          THEN
             NULL;
       END get_email_details;
    END ms_gen_process_email;
    but i am getting this error
    Error(15,31): PLS-00201: identifier 'P_EMAIL_TYPE_TABLE' must be declared
    Regards
    Damby

    If you need to call a procedure which has yet to be defined in your package, you can use forward declaration...
    That means that you declare the procedure/function before the place it's going to be called (typically people do this at the top of the package) without providing a body for the code...
    PACKAGE BODY        ms_gen_process_email as
       PROCEDURE get_email_details
          p_metric_name     IN   VARCHAR2,
          p_current_stage   IN   VARCHAR2,
          P_ACTION          in   varchar2,
          p_email_type_table out email_type_table
       ); -- Forward declaration of get_email_details procedure
        procedure process_email_master(
          p_metric_name     IN   VARCHAR2,
          p_current_stage   in   varchar2,
          p_action          in   varchar2,
          p_pid             in    number,
          p_object_id       in    varchar2
          as
          begin
          null;
           EXCEPTION
          WHEN OTHERS
          then
             null;
          end process_email_master;
       PROCEDURE get_email_details
          p_metric_name     IN   VARCHAR2,
          p_current_stage   IN   VARCHAR2,
          P_ACTION          in   varchar2,
          p_email_type_table out email_type_table
       ) as

  • Trying to build HTMLDOC

    Hi all
    I'm trying to build HTMLDOC as part of my larger attempt to install FOG which is a free ghost clone. I'm running into a make error 1 presumably related to the png configuration. But if it is the png conf, I'm not sure how to pinpoint what part is causing the error. Your help is kindly appreciated.
    [indata@poweredge1600sc ~]$ cd htmldoc-1.8.27/
    [indata@poweredge1600sc htmldoc-1.8.27]$ sudo make
    [sudo] password for indata:
    Making all in htmldoc...
    Compiling image.cxx...
    In file included from /usr/include/pngconf.h:72:0,
    from /usr/include/png.h:446,
    from image.cxx:58:
    image.cxx: In function ‘int image_load_png(image_t*, FILE*, int, int)’:
    image.cxx:1502:16: error: invalid use of incomplete type ‘png_struct {aka struct png_struct_def}’
    if (setjmp(pp->jmpbuf))
    ^
    In file included from image.cxx:58:0:
    /usr/include/png.h:556:16: error: forward declaration of ‘png_struct {aka struct png_struct_def}’
    typedef struct png_struct_def png_struct;
    ^
    image.cxx:1529:11: error: invalid use of incomplete type ‘png_info {aka struct png_info_def}’
    if (info->color_type & PNG_COLOR_MASK_PALETTE)
    ^
    In file included from image.cxx:58:0:
    /usr/include/png.h:570:16: error: forward declaration of ‘png_info {aka struct png_info_def}’
    typedef struct png_info_def png_info;
    ^
    image.cxx:1538:16: error: invalid use of incomplete type ‘png_info {aka struct png_info_def}’
    else if (info->bit_depth < 8)
    ^
    In file included from image.cxx:58:0:
    /usr/include/png.h:570:16: error: forward declaration of ‘png_info {aka struct png_info_def}’
    typedef struct png_info_def png_info;
    ^
    image.cxx:1543:16: error: invalid use of incomplete type ‘png_info {aka struct png_info_def}’
    else if (info->bit_depth == 16)
    ^
    In file included from image.cxx:58:0:
    /usr/include/png.h:570:16: error: forward declaration of ‘png_info {aka struct png_info_def}’
    typedef struct png_info_def png_info;
    ^
    image.cxx:1546:11: error: invalid use of incomplete type ‘png_info {aka struct png_info_def}’
    if (info->color_type & PNG_COLOR_MASK_COLOR)
    ^
    In file included from image.cxx:58:0:
    /usr/include/png.h:570:16: error: forward declaration of ‘png_info {aka struct png_info_def}’
    typedef struct png_info_def png_info;
    ^
    image.cxx:1557:21: error: invalid use of incomplete type ‘png_info {aka struct png_info_def}’
    img->width = info->width;
    ^
    In file included from image.cxx:58:0:
    /usr/include/png.h:570:16: error: forward declaration of ‘png_info {aka struct png_info_def}’
    typedef struct png_info_def png_info;
    ^
    image.cxx:1558:21: error: invalid use of incomplete type ‘png_info {aka struct png_info_def}’
    img->height = info->height;
    ^
    In file included from image.cxx:58:0:
    /usr/include/png.h:570:16: error: forward declaration of ‘png_info {aka struct png_info_def}’
    typedef struct png_info_def png_info;
    ^
    image.cxx:1560:12: error: invalid use of incomplete type ‘png_info {aka struct png_info_def}’
    if ((info->color_type & PNG_COLOR_MASK_ALPHA) || info->num_trans)
    ^
    In file included from image.cxx:58:0:
    /usr/include/png.h:570:16: error: forward declaration of ‘png_info {aka struct png_info_def}’
    typedef struct png_info_def png_info;
    ^
    image.cxx:1560:56: error: invalid use of incomplete type ‘png_info {aka struct png_info_def}’
    if ((info->color_type & PNG_COLOR_MASK_ALPHA) || info->num_trans)
    ^
    In file included from image.cxx:58:0:
    /usr/include/png.h:570:16: error: forward declaration of ‘png_info {aka struct png_info_def}’
    typedef struct png_info_def png_info;
    ^
    image.cxx:1597:34: error: invalid use of incomplete type ‘png_info {aka struct png_info_def}’
    rows = (png_bytep *)calloc(info->height, sizeof(png_bytep));
    ^
    In file included from image.cxx:58:0:
    /usr/include/png.h:570:16: error: forward declaration of ‘png_info {aka struct png_info_def}’
    typedef struct png_info_def png_info;
    ^
    image.cxx:1599:28: error: invalid use of incomplete type ‘png_info {aka struct png_info_def}’
    for (i = 0; i < (int)info->height; i ++)
    ^
    In file included from image.cxx:58:0:
    /usr/include/png.h:570:16: error: forward declaration of ‘png_info {aka struct png_info_def}’
    typedef struct png_info_def png_info;
    ^
    image.cxx:1613:12: error: invalid use of incomplete type ‘png_info {aka struct png_info_def}’
    if ((info->color_type & PNG_COLOR_MASK_ALPHA) || info->num_trans)
    ^
    In file included from image.cxx:58:0:
    /usr/include/png.h:570:16: error: forward declaration of ‘png_info {aka struct png_info_def}’
    typedef struct png_info_def png_info;
    ^
    image.cxx:1613:56: error: invalid use of incomplete type ‘png_info {aka struct png_info_def}’
    if ((info->color_type & PNG_COLOR_MASK_ALPHA) || info->num_trans)
    ^
    In file included from image.cxx:58:0:
    /usr/include/png.h:570:16: error: forward declaration of ‘png_info {aka struct png_info_def}’
    typedef struct png_info_def png_info;
    ^
    image.cxx:1642:19: error: invalid use of incomplete type ‘png_info {aka struct png_info_def}’
    if (gray && info->color_type & PNG_COLOR_MASK_COLOR)
    ^
    In file included from image.cxx:58:0:
    /usr/include/png.h:570:16: error: forward declaration of ‘png_info {aka struct png_info_def}’
    typedef struct png_info_def png_info;
    ^
    make[1]: *** [image.o] Error 1
    [indata@poweredge1600sc htmldoc-1.8.27]$
    # "$Id: Makefile.in 1397 2005-04-24 19:20:32Z mike $"
    # Makefile for HTMLDOC, an HTML document processing program.
    # Copyright 1997-2005 by Easy Software Products.
    # These coded instructions, statements, and computer programs are the
    # property of Easy Software Products and are protected by Federal
    # copyright law. Distribution and use rights are outlined in the file
    # "COPYING.txt" which should have been included with this file. If this
    # file is missing or damaged please contact Easy Software Products
    # at:
    # Attn: ESP Licensing Information
    # Easy Software Products
    # 44141 Airport View Drive, Suite 204
    # Hollywood, Maryland 20636-3142 USA
    # Voice: (301) 373-9600
    # EMail: [email protected]
    # WWW: http://www.easysw.com
    # Include common definitions...
    include Makedefs
    # Software packaging...
    EPM = epm -v --output-dir dist
    # Subdirectories...
    DIRS = htmldoc doc
    INSTALLDIRS = fonts data doc htmldoc
    # Make all targets...
    all: Makedefs Makefile config.h htmldoc.list
    for dir in $(DIRS); do\
    echo Making all in $$dir...;\
    (cd $$dir; $(MAKE) -$(MAKEFLAGS)) || break;\
    done
    # Remove object and target files...
    clean:
    for dir in $(DIRS); do\
    echo Cleaning in $$dir...;\
    (cd $$dir; $(MAKE) -$(MAKEFLAGS) clean) || break;\
    done
    $(RM) *.bak
    $(RM) *.bck
    $(RM) core
    $(RM) core.*
    $(RM) -r autom4te*.cache
    $(RM) config.h config.log config.status
    # Install object and target files...
    install:
    $(MAKE) all
    for dir in $(INSTALLDIRS); do\
    echo Installing in $$dir...;\
    (cd $$dir; $(MAKE) -$(MAKEFLAGS) install) || break;\
    done
    # Makedefs
    Makedefs: Makedefs.in configure
    if test -f config.status; then \
    ./config.status --recheck; \
    ./config.status; \
    else \
    ./configure; \
    fi
    touch config.h
    # Makefile
    Makefile: Makefile.in configure
    if test -f config.status; then \
    ./config.status --recheck; \
    ./config.status; \
    else \
    ./configure; \
    fi
    touch config.h
    # config.h
    config.h: config.h.in configure
    if test -f config.status; then \
    ./config.status --recheck; \
    ./config.status; \
    else \
    ./configure; \
    fi
    touch config.h
    # htmldoc.list
    htmldoc.list: htmldoc.list.in configure
    if test -f config.status; then \
    ./config.status --recheck; \
    ./config.status; \
    else \
    ./configure; \
    fi
    touch config.h
    # Make a portable binary distribution using EPM.
    # EPM = ESP Package Manager, available at "http://www.easysw.com/epm/".
    epm:
    $(RM) -r dist
    $(EPM) htmldoc
    # End of "$Id: Makefile.in 1397 2005-04-24 19:20:32Z mike $".
    pngconf.h
    /* pngconf.h - machine configurable file for libpng
    * libpng version 1.2.7 - September 12, 2004
    * For conditions of distribution and use, see copyright notice in png.h
    * Copyright (c) 1998-2004 Glenn Randers-Pehrson
    * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
    * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
    /* Any machine specific code is near the front of this file, so if you
    * are configuring libpng for a machine, you may want to read the section
    * starting here down to where it starts to typedef png_color, png_text,
    * and png_info.
    #ifndef PNGCONF_H
    #define PNGCONF_H
    #ifdef PNG_USER_CONFIG
    #include "pngusr.h"
    #endif
    /* This is the size of the compression buffer, and thus the size of
    * an IDAT chunk. Make this whatever size you feel is best for your
    * machine. One of these will be allocated per png_struct. When this
    * is full, it writes the data to the disk, and does some other
    * calculations. Making this an extremely small size will slow
    * the library down, but you may want to experiment to determine
    * where it becomes significant, if you are concerned with memory
    * usage. Note that zlib allocates at least 32Kb also. For readers,
    * this describes the size of the buffer available to read the data in.
    * Unless this gets smaller than the size of a row (compressed),
    * it should not make much difference how big this is.
    #ifndef PNG_ZBUF_SIZE
    # define PNG_ZBUF_SIZE 8192
    #endif
    /* Enable if you want a write-only libpng */
    #ifndef PNG_NO_READ_SUPPORTED
    # define PNG_READ_SUPPORTED
    #endif
    /* Enable if you want a read-only libpng */
    #ifndef PNG_NO_WRITE_SUPPORTED
    # define PNG_WRITE_SUPPORTED
    #endif
    /* Enabled by default in 1.2.0. You can disable this if you don't need to
    support PNGs that are embedded in MNG datastreams */
    #if !defined(PNG_1_0_X) && !defined(PNG_NO_MNG_FEATURES)
    # ifndef PNG_MNG_FEATURES_SUPPORTED
    # define PNG_MNG_FEATURES_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_FLOATING_POINT_SUPPORTED
    # ifndef PNG_FLOATING_POINT_SUPPORTED
    # define PNG_FLOATING_POINT_SUPPORTED
    # endif
    #endif
    /* If you are running on a machine where you cannot allocate more
    * than 64K of memory at once, uncomment this. While libpng will not
    * normally need that much memory in a chunk (unless you load up a very
    * large file), zlib needs to know how big of a chunk it can use, and
    * libpng thus makes sure to check any memory allocation to verify it
    * will fit into memory.
    #define PNG_MAX_MALLOC_64K
    #if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K)
    # define PNG_MAX_MALLOC_64K
    #endif
    /* Special munging to support doing things the 'cygwin' way:
    * 'Normal' png-on-win32 defines/defaults:
    * PNG_BUILD_DLL -- building dll
    * PNG_USE_DLL -- building an application, linking to dll
    * (no define) -- building static library, or building an
    * application and linking to the static lib
    * 'Cygwin' defines/defaults:
    * PNG_BUILD_DLL -- (ignored) building the dll
    * (no define) -- (ignored) building an application, linking to the dll
    * PNG_STATIC -- (ignored) building the static lib, or building an
    * application that links to the static lib.
    * ALL_STATIC -- (ignored) building various static libs, or building an
    * application that links to the static libs.
    * Thus,
    * a cygwin user should define either PNG_BUILD_DLL or PNG_STATIC, and
    * this bit of #ifdefs will define the 'correct' config variables based on
    * that. If a cygwin user *wants* to define 'PNG_USE_DLL' that's okay, but
    * unnecessary.
    * Also, the precedence order is:
    * ALL_STATIC (since we can't #undef something outside our namespace)
    * PNG_BUILD_DLL
    * PNG_STATIC
    * (nothing) == PNG_USE_DLL
    * CYGWIN (2002-01-20): The preceding is now obsolete. With the advent
    * of auto-import in binutils, we no longer need to worry about
    * __declspec(dllexport) / __declspec(dllimport) and friends. Therefore,
    * we don't need to worry about PNG_STATIC or ALL_STATIC when it comes
    * to __declspec() stuff. However, we DO need to worry about
    * PNG_BUILD_DLL and PNG_STATIC because those change some defaults
    * such as CONSOLE_IO and whether GLOBAL_ARRAYS are allowed.
    #if defined(__CYGWIN__)
    # if defined(ALL_STATIC)
    # if defined(PNG_BUILD_DLL)
    # undef PNG_BUILD_DLL
    # endif
    # if defined(PNG_USE_DLL)
    # undef PNG_USE_DLL
    # endif
    # if defined(PNG_DLL)
    # undef PNG_DLL
    # endif
    # if !defined(PNG_STATIC)
    # define PNG_STATIC
    # endif
    # else
    # if defined (PNG_BUILD_DLL)
    # if defined(PNG_STATIC)
    # undef PNG_STATIC
    # endif
    # if defined(PNG_USE_DLL)
    # undef PNG_USE_DLL
    # endif
    # if !defined(PNG_DLL)
    # define PNG_DLL
    # endif
    # else
    # if defined(PNG_STATIC)
    # if defined(PNG_USE_DLL)
    # undef PNG_USE_DLL
    # endif
    # if defined(PNG_DLL)
    # undef PNG_DLL
    # endif
    # else
    # if !defined(PNG_USE_DLL)
    # define PNG_USE_DLL
    # endif
    # if !defined(PNG_DLL)
    # define PNG_DLL
    # endif
    # endif
    # endif
    # endif
    #endif
    /* This protects us against compilers that run on a windowing system
    * and thus don't have or would rather us not use the stdio types:
    * stdin, stdout, and stderr. The only one currently used is stderr
    * in png_error() and png_warning(). #defining PNG_NO_CONSOLE_IO will
    * prevent these from being compiled and used. #defining PNG_NO_STDIO
    * will also prevent these, plus will prevent the entire set of stdio
    * macros and functions (FILE *, printf, etc.) from being compiled and used,
    * unless (PNG_DEBUG > 0) has been #defined.
    * #define PNG_NO_CONSOLE_IO
    * #define PNG_NO_STDIO
    #if defined(_WIN32_WCE)
    # include <windows.h>
    /* Console I/O functions are not supported on WindowsCE */
    # define PNG_NO_CONSOLE_IO
    # ifdef PNG_DEBUG
    # undef PNG_DEBUG
    # endif
    #endif
    #ifdef PNG_BUILD_DLL
    # ifndef PNG_CONSOLE_IO_SUPPORTED
    # ifndef PNG_NO_CONSOLE_IO
    # define PNG_NO_CONSOLE_IO
    # endif
    # endif
    #endif
    # ifdef PNG_NO_STDIO
    # ifndef PNG_NO_CONSOLE_IO
    # define PNG_NO_CONSOLE_IO
    # endif
    # ifdef PNG_DEBUG
    # if (PNG_DEBUG > 0)
    # include <stdio.h>
    # endif
    # endif
    # else
    # if !defined(_WIN32_WCE)
    /* "stdio.h" functions are not supported on WindowsCE */
    # include <stdio.h>
    # endif
    # endif
    /* This macro protects us against machines that don't have function
    * prototypes (ie K&R style headers). If your compiler does not handle
    * function prototypes, define this macro and use the included ansi2knr.
    * I've always been able to use _NO_PROTO as the indicator, but you may
    * need to drag the empty declaration out in front of here, or change the
    * ifdef to suit your own needs.
    #ifndef PNGARG
    #ifdef OF /* zlib prototype munger */
    # define PNGARG(arglist) OF(arglist)
    #else
    #ifdef _NO_PROTO
    # define PNGARG(arglist) ()
    # ifndef PNG_TYPECAST_NULL
    # define PNG_TYPECAST_NULL
    # endif
    #else
    # define PNGARG(arglist) arglist
    #endif /* _NO_PROTO */
    #endif /* OF */
    #endif /* PNGARG */
    /* Try to determine if we are compiling on a Mac. Note that testing for
    * just __MWERKS__ is not good enough, because the Codewarrior is now used
    * on non-Mac platforms.
    #ifndef MACOS
    # if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \
    defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC)
    # define MACOS
    # endif
    #endif
    /* enough people need this for various reasons to include it here */
    #if !defined(MACOS) && !defined(RISCOS) && !defined(_WIN32_WCE)
    # include <sys/types.h>
    #endif
    #if !defined(PNG_SETJMP_NOT_SUPPORTED) && !defined(PNG_NO_SETJMP_SUPPORTED)
    # define PNG_SETJMP_SUPPORTED
    #endif
    #ifdef PNG_SETJMP_SUPPORTED
    /* This is an attempt to force a single setjmp behaviour on Linux. If
    * the X config stuff didn't define _BSD_SOURCE we wouldn't need this.
    # ifdef __linux__
    # ifdef _BSD_SOURCE
    # define PNG_SAVE_BSD_SOURCE
    # undef _BSD_SOURCE
    # endif
    # ifdef _SETJMP_H
    /* If you encounter a compiler error here, see the explanation
    * near the end of INSTALL.
    __png.h__ already includes setjmp.h;
    __dont__ include it again.;
    # endif
    # endif /* __linux__ */
    /* include setjmp.h for error handling */
    # include <setjmp.h>
    # ifdef __linux__
    # ifdef PNG_SAVE_BSD_SOURCE
    # define _BSD_SOURCE
    # undef PNG_SAVE_BSD_SOURCE
    # endif
    # endif /* __linux__ */
    #endif /* PNG_SETJMP_SUPPORTED */
    #ifdef BSD
    # include <strings.h>
    #else
    # include <string.h>
    #endif
    /* Other defines for things like memory and the like can go here. */
    #ifdef PNG_INTERNAL
    #include <stdlib.h>
    /* The functions exported by PNG_EXTERN are PNG_INTERNAL functions, which
    * aren't usually used outside the library (as far as I know), so it is
    * debatable if they should be exported at all. In the future, when it is
    * possible to have run-time registry of chunk-handling functions, some of
    * these will be made available again.
    #define PNG_EXTERN extern
    #define PNG_EXTERN
    /* Other defines specific to compilers can go here. Try to keep
    * them inside an appropriate ifdef/endif pair for portability.
    #if defined(PNG_FLOATING_POINT_SUPPORTED)
    # if defined(MACOS)
    /* We need to check that <math.h> hasn't already been included earlier
    * as it seems it doesn't agree with <fp.h>, yet we should really use
    * <fp.h> if possible.
    # if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__)
    # include <fp.h>
    # endif
    # else
    # include <math.h>
    # endif
    # if defined(_AMIGA) && defined(__SASC) && defined(_M68881)
    /* Amiga SAS/C: We must include builtin FPU functions when compiling using
    * MATH=68881
    # include <m68881.h>
    # endif
    #endif
    /* Codewarrior on NT has linking problems without this. */
    #if (defined(__MWERKS__) && defined(WIN32)) || defined(__STDC__)
    # define PNG_ALWAYS_EXTERN
    #endif
    /* This provides the non-ANSI (far) memory allocation routines. */
    #if defined(__TURBOC__) && defined(__MSDOS__)
    # include <mem.h>
    # include <alloc.h>
    #endif
    /* I have no idea why is this necessary... */
    #if defined(_MSC_VER) && (defined(WIN32) || defined(_Windows) || \
    defined(_WINDOWS) || defined(_WIN32) || defined(__WIN32__))
    # include <malloc.h>
    #endif
    /* This controls how fine the dithering gets. As this allocates
    * a largish chunk of memory (32K), those who are not as concerned
    * with dithering quality can decrease some or all of these.
    #ifndef PNG_DITHER_RED_BITS
    # define PNG_DITHER_RED_BITS 5
    #endif
    #ifndef PNG_DITHER_GREEN_BITS
    # define PNG_DITHER_GREEN_BITS 5
    #endif
    #ifndef PNG_DITHER_BLUE_BITS
    # define PNG_DITHER_BLUE_BITS 5
    #endif
    /* This controls how fine the gamma correction becomes when you
    * are only interested in 8 bits anyway. Increasing this value
    * results in more memory being used, and more pow() functions
    * being called to fill in the gamma tables. Don't set this value
    * less then 8, and even that may not work (I haven't tested it).
    #ifndef PNG_MAX_GAMMA_8
    # define PNG_MAX_GAMMA_8 11
    #endif
    /* This controls how much a difference in gamma we can tolerate before
    * we actually start doing gamma conversion.
    #ifndef PNG_GAMMA_THRESHOLD
    # define PNG_GAMMA_THRESHOLD 0.05
    #endif
    #endif /* PNG_INTERNAL */
    /* The following uses const char * instead of char * for error
    * and warning message functions, so some compilers won't complain.
    * If you do not want to use const, define PNG_NO_CONST here.
    #ifndef PNG_NO_CONST
    # define PNG_CONST const
    #else
    # define PNG_CONST
    #endif
    /* The following defines give you the ability to remove code from the
    * library that you will not be using. I wish I could figure out how to
    * automate this, but I can't do that without making it seriously hard
    * on the users. So if you are not using an ability, change the #define
    * to and #undef, and that part of the library will not be compiled. If
    * your linker can't find a function, you may want to make sure the
    * ability is defined here. Some of these depend upon some others being
    * defined. I haven't figured out all the interactions here, so you may
    * have to experiment awhile to get everything to compile. If you are
    * creating or using a shared library, you probably shouldn't touch this,
    * as it will affect the size of the structures, and this will cause bad
    * things to happen if the library and/or application ever change.
    /* Any features you will not be using can be undef'ed here */
    /* GR-P, 0.96a: Set "*TRANSFORMS_SUPPORTED as default but allow user
    * to turn it off with "*TRANSFORMS_NOT_SUPPORTED" or *PNG_NO_*_TRANSFORMS
    * on the compile line, then pick and choose which ones to define without
    * having to edit this file. It is safe to use the *TRANSFORMS_NOT_SUPPORTED
    * if you only want to have a png-compliant reader/writer but don't need
    * any of the extra transformations. This saves about 80 kbytes in a
    * typical installation of the library. (PNG_NO_* form added in version
    * 1.0.1c, for consistency)
    /* The size of the png_text structure changed in libpng-1.0.6 when
    * iTXt is supported. It is turned off by default, to support old apps
    * that malloc the png_text structure instead of calling png_set_text()
    * and letting libpng malloc it. It will be turned on by default in
    * libpng-1.3.0.
    #ifndef PNG_iTXt_SUPPORTED
    # if !defined(PNG_READ_iTXt_SUPPORTED) && !defined(PNG_NO_READ_iTXt)
    # define PNG_NO_READ_iTXt
    # endif
    # if !defined(PNG_WRITE_iTXt_SUPPORTED) && !defined(PNG_NO_WRITE_iTXt)
    # define PNG_NO_WRITE_iTXt
    # endif
    #endif
    /* The following support, added after version 1.0.0, can be turned off here en
    * masse by defining PNG_LEGACY_SUPPORTED in case you need binary compatibility
    * with old applications that require the length of png_struct and png_info
    * to remain unchanged.
    #ifdef PNG_LEGACY_SUPPORTED
    # define PNG_NO_FREE_ME
    # define PNG_NO_READ_UNKNOWN_CHUNKS
    # define PNG_NO_WRITE_UNKNOWN_CHUNKS
    # define PNG_NO_READ_USER_CHUNKS
    # define PNG_NO_READ_iCCP
    # define PNG_NO_WRITE_iCCP
    # define PNG_NO_READ_iTXt
    # define PNG_NO_WRITE_iTXt
    # define PNG_NO_READ_sCAL
    # define PNG_NO_WRITE_sCAL
    # define PNG_NO_READ_sPLT
    # define PNG_NO_WRITE_sPLT
    # define PNG_NO_INFO_IMAGE
    # define PNG_NO_READ_RGB_TO_GRAY
    # define PNG_NO_READ_USER_TRANSFORM
    # define PNG_NO_WRITE_USER_TRANSFORM
    # define PNG_NO_USER_MEM
    # define PNG_NO_READ_EMPTY_PLTE
    # define PNG_NO_MNG_FEATURES
    # define PNG_NO_FIXED_POINT_SUPPORTED
    #endif
    /* Ignore attempt to turn off both floating and fixed point support */
    #if !defined(PNG_FLOATING_POINT_SUPPORTED) || \
    !defined(PNG_NO_FIXED_POINT_SUPPORTED)
    # define PNG_FIXED_POINT_SUPPORTED
    #endif
    #ifndef PNG_NO_FREE_ME
    # define PNG_FREE_ME_SUPPORTED
    #endif
    #if defined(PNG_READ_SUPPORTED)
    #if !defined(PNG_READ_TRANSFORMS_NOT_SUPPORTED) && \
    !defined(PNG_NO_READ_TRANSFORMS)
    # define PNG_READ_TRANSFORMS_SUPPORTED
    #endif
    #ifdef PNG_READ_TRANSFORMS_SUPPORTED
    # ifndef PNG_NO_READ_EXPAND
    # define PNG_READ_EXPAND_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_SHIFT
    # define PNG_READ_SHIFT_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_PACK
    # define PNG_READ_PACK_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_BGR
    # define PNG_READ_BGR_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_SWAP
    # define PNG_READ_SWAP_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_PACKSWAP
    # define PNG_READ_PACKSWAP_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_INVERT
    # define PNG_READ_INVERT_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_DITHER
    # define PNG_READ_DITHER_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_BACKGROUND
    # define PNG_READ_BACKGROUND_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_16_TO_8
    # define PNG_READ_16_TO_8_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_FILLER
    # define PNG_READ_FILLER_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_GAMMA
    # define PNG_READ_GAMMA_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_GRAY_TO_RGB
    # define PNG_READ_GRAY_TO_RGB_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_SWAP_ALPHA
    # define PNG_READ_SWAP_ALPHA_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_INVERT_ALPHA
    # define PNG_READ_INVERT_ALPHA_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_STRIP_ALPHA
    # define PNG_READ_STRIP_ALPHA_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_USER_TRANSFORM
    # define PNG_READ_USER_TRANSFORM_SUPPORTED
    # endif
    # ifndef PNG_NO_READ_RGB_TO_GRAY
    # define PNG_READ_RGB_TO_GRAY_SUPPORTED
    # endif
    #endif /* PNG_READ_TRANSFORMS_SUPPORTED */
    #if !defined(PNG_NO_PROGRESSIVE_READ) && \
    !defined(PNG_PROGRESSIVE_READ_NOT_SUPPORTED) /* if you don't do progressive */
    # define PNG_PROGRESSIVE_READ_SUPPORTED /* reading. This is not talking */
    #endif /* about interlacing capability! You'll */
    /* still have interlacing unless you change the following line: */
    #define PNG_READ_INTERLACING_SUPPORTED /* required for PNG-compliant decoders */
    #ifndef PNG_NO_READ_COMPOSITE_NODIV
    # ifndef PNG_NO_READ_COMPOSITED_NODIV /* libpng-1.0.x misspelling */
    # define PNG_READ_COMPOSITE_NODIV_SUPPORTED /* well tested on Intel, SGI */
    # endif
    #endif
    /* Deprecated, will be removed from version 2.0.0.
    Use PNG_MNG_FEATURES_SUPPORTED instead. */
    #ifndef PNG_NO_READ_EMPTY_PLTE
    # define PNG_READ_EMPTY_PLTE_SUPPORTED
    #endif
    #endif /* PNG_READ_SUPPORTED */
    #if defined(PNG_WRITE_SUPPORTED)
    # if !defined(PNG_WRITE_TRANSFORMS_NOT_SUPPORTED) && \
    !defined(PNG_NO_WRITE_TRANSFORMS)
    # define PNG_WRITE_TRANSFORMS_SUPPORTED
    #endif
    #ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
    # ifndef PNG_NO_WRITE_SHIFT
    # define PNG_WRITE_SHIFT_SUPPORTED
    # endif
    # ifndef PNG_NO_WRITE_PACK
    # define PNG_WRITE_PACK_SUPPORTED
    # endif
    # ifndef PNG_NO_WRITE_BGR
    # define PNG_WRITE_BGR_SUPPORTED
    # endif
    # ifndef PNG_NO_WRITE_SWAP
    # define PNG_WRITE_SWAP_SUPPORTED
    # endif
    # ifndef PNG_NO_WRITE_PACKSWAP
    # define PNG_WRITE_PACKSWAP_SUPPORTED
    # endif
    # ifndef PNG_NO_WRITE_INVERT
    # define PNG_WRITE_INVERT_SUPPORTED
    # endif
    # ifndef PNG_NO_WRITE_FILLER
    # define PNG_WRITE_FILLER_SUPPORTED /* same as WRITE_STRIP_ALPHA */
    # endif
    # ifndef PNG_NO_WRITE_SWAP_ALPHA
    # define PNG_WRITE_SWAP_ALPHA_SUPPORTED
    # endif
    # ifndef PNG_NO_WRITE_INVERT_ALPHA
    # define PNG_WRITE_INVERT_ALPHA_SUPPORTED
    # endif
    # ifndef PNG_NO_WRITE_USER_TRANSFORM
    # define PNG_WRITE_USER_TRANSFORM_SUPPORTED
    # endif
    #endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */
    #define PNG_WRITE_INTERLACING_SUPPORTED /* not required for PNG-compliant
    encoders, but can cause trouble
    if left undefined */
    #if !defined(PNG_NO_WRITE_WEIGHTED_FILTER) && \
    defined(PNG_FLOATING_POINT_SUPPORTED)
    # define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
    #endif
    #ifndef PNG_NO_WRITE_FLUSH
    # define PNG_WRITE_FLUSH_SUPPORTED
    #endif
    /* Deprecated, see PNG_MNG_FEATURES_SUPPORTED, above */
    #ifndef PNG_NO_WRITE_EMPTY_PLTE
    # define PNG_WRITE_EMPTY_PLTE_SUPPORTED
    #endif
    #endif /* PNG_WRITE_SUPPORTED */
    #ifndef PNG_1_0_X
    # ifndef PNG_NO_ERROR_NUMBERS
    # define PNG_ERROR_NUMBERS_SUPPORTED
    # endif
    #endif /* PNG_1_0_X */
    #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
    # ifndef PNG_NO_USER_TRANSFORM_PTR
    # define PNG_USER_TRANSFORM_PTR_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_STDIO
    # define PNG_TIME_RFC1123_SUPPORTED
    #endif
    /* This adds extra functions in pngget.c for accessing data from the
    * info pointer (added in version 0.99)
    * png_get_image_width()
    * png_get_image_height()
    * png_get_bit_depth()
    * png_get_color_type()
    * png_get_compression_type()
    * png_get_filter_type()
    * png_get_interlace_type()
    * png_get_pixel_aspect_ratio()
    * png_get_pixels_per_meter()
    * png_get_x_offset_pixels()
    * png_get_y_offset_pixels()
    * png_get_x_offset_microns()
    * png_get_y_offset_microns()
    #if !defined(PNG_NO_EASY_ACCESS) && !defined(PNG_EASY_ACCESS_SUPPORTED)
    # define PNG_EASY_ACCESS_SUPPORTED
    #endif
    /* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0
    even when PNG_USE_PNGVCRD or PNG_USE_PNGGCCRD is not defined */
    #if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_ASSEMBLER_CODE)
    # ifndef PNG_ASSEMBLER_CODE_SUPPORTED
    # define PNG_ASSEMBLER_CODE_SUPPORTED
    # endif
    # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE)
    # define PNG_MMX_CODE_SUPPORTED
    # endif
    #endif
    /* If you are sure that you don't need thread safety and you are compiling
    with PNG_USE_PNGCCRD for an MMX application, you can define this for
    faster execution. See pnggccrd.c.
    #define PNG_THREAD_UNSAFE_OK
    #if !defined(PNG_1_0_X)
    #if !defined(PNG_NO_USER_MEM) && !defined(PNG_USER_MEM_SUPPORTED)
    # define PNG_USER_MEM_SUPPORTED
    #endif
    #endif /* PNG_1_0_X */
    /* Added at libpng-1.2.6 */
    #if !defined(PNG_1_0_X)
    #ifndef PNG_SET_USER_LIMITS_SUPPORTED
    #if !defined(PNG_NO_SET_USER_LIMITS) && !defined(PNG_SET_USER_LIMITS_SUPPORTED)
    # define PNG_SET_USER_LIMITS_SUPPORTED
    #endif
    #endif
    #endif /* PNG_1_0_X */
    /* Added at libpng-1.0.16 and 1.2.6. To accept all valid PNGS no matter
    * how large, set these limits to 0x7fffffffL
    #ifndef PNG_USER_WIDTH_MAX
    # define PNG_USER_WIDTH_MAX 1000000L
    #endif
    #ifndef PNG_USER_HEIGHT_MAX
    # define PNG_USER_HEIGHT_MAX 1000000L
    #endif
    /* These are currently experimental features, define them if you want */
    /* very little testing */
    #ifdef PNG_READ_SUPPORTED
    # ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
    # define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
    # endif
    #endif
    /* This is only for PowerPC big-endian and 680x0 systems */
    /* some testing */
    #ifndef PNG_READ_BIG_ENDIAN_SUPPORTED
    # define PNG_READ_BIG_ENDIAN_SUPPORTED
    #endif
    /* Buggy compilers (e.g., gcc 2.7.2.2) need this */
    #define PNG_NO_POINTER_INDEXING
    /* These functions are turned off by default, as they will be phased out. */
    #define PNG_USELESS_TESTS_SUPPORTED
    #define PNG_CORRECT_PALETTE_SUPPORTED
    /* Any chunks you are not interested in, you can undef here. The
    * ones that allocate memory may be expecially important (hIST,
    * tEXt, zTXt, tRNS, pCAL). Others will just save time and make png_info
    * a bit smaller.
    #if defined(PNG_READ_SUPPORTED) && \
    !defined(PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \
    !defined(PNG_NO_READ_ANCILLARY_CHUNKS)
    # define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED
    #endif
    #if defined(PNG_WRITE_SUPPORTED) && \
    !defined(PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \
    !defined(PNG_NO_WRITE_ANCILLARY_CHUNKS)
    # define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED
    #endif
    #ifdef PNG_READ_ANCILLARY_CHUNKS_SUPPORTED
    #ifdef PNG_NO_READ_TEXT
    # define PNG_NO_READ_iTXt
    # define PNG_NO_READ_tEXt
    # define PNG_NO_READ_zTXt
    #endif
    #ifndef PNG_NO_READ_bKGD
    # define PNG_READ_bKGD_SUPPORTED
    # define PNG_bKGD_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_cHRM
    # define PNG_READ_cHRM_SUPPORTED
    # define PNG_cHRM_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_gAMA
    # define PNG_READ_gAMA_SUPPORTED
    # define PNG_gAMA_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_hIST
    # define PNG_READ_hIST_SUPPORTED
    # define PNG_hIST_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_iCCP
    # define PNG_READ_iCCP_SUPPORTED
    # define PNG_iCCP_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_iTXt
    # ifndef PNG_READ_iTXt_SUPPORTED
    # define PNG_READ_iTXt_SUPPORTED
    # endif
    # ifndef PNG_iTXt_SUPPORTED
    # define PNG_iTXt_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_READ_oFFs
    # define PNG_READ_oFFs_SUPPORTED
    # define PNG_oFFs_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_pCAL
    # define PNG_READ_pCAL_SUPPORTED
    # define PNG_pCAL_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_sCAL
    # define PNG_READ_sCAL_SUPPORTED
    # define PNG_sCAL_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_pHYs
    # define PNG_READ_pHYs_SUPPORTED
    # define PNG_pHYs_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_sBIT
    # define PNG_READ_sBIT_SUPPORTED
    # define PNG_sBIT_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_sPLT
    # define PNG_READ_sPLT_SUPPORTED
    # define PNG_sPLT_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_sRGB
    # define PNG_READ_sRGB_SUPPORTED
    # define PNG_sRGB_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_tEXt
    # define PNG_READ_tEXt_SUPPORTED
    # define PNG_tEXt_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_tIME
    # define PNG_READ_tIME_SUPPORTED
    # define PNG_tIME_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_tRNS
    # define PNG_READ_tRNS_SUPPORTED
    # define PNG_tRNS_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_zTXt
    # define PNG_READ_zTXt_SUPPORTED
    # define PNG_zTXt_SUPPORTED
    #endif
    #ifndef PNG_NO_READ_UNKNOWN_CHUNKS
    # define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
    # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED
    # define PNG_UNKNOWN_CHUNKS_SUPPORTED
    # endif
    # ifndef PNG_NO_HANDLE_AS_UNKNOWN
    # define PNG_HANDLE_AS_UNKNOWN_SUPPORTED
    # endif
    #endif
    #if !defined(PNG_NO_READ_USER_CHUNKS) && \
    defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
    # define PNG_READ_USER_CHUNKS_SUPPORTED
    # define PNG_USER_CHUNKS_SUPPORTED
    # ifdef PNG_NO_READ_UNKNOWN_CHUNKS
    # undef PNG_NO_READ_UNKNOWN_CHUNKS
    # endif
    # ifdef PNG_NO_HANDLE_AS_UNKNOWN
    # undef PNG_NO_HANDLE_AS_UNKNOWN
    # endif
    #endif
    #ifndef PNG_NO_READ_OPT_PLTE
    # define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the */
    #endif /* optional PLTE chunk in RGB and RGBA images */
    #if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \
    defined(PNG_READ_zTXt_SUPPORTED)
    # define PNG_READ_TEXT_SUPPORTED
    # define PNG_TEXT_SUPPORTED
    #endif
    #endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */
    #ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED
    #ifdef PNG_NO_WRITE_TEXT
    # define PNG_NO_WRITE_iTXt
    # define PNG_NO_WRITE_tEXt
    # define PNG_NO_WRITE_zTXt
    #endif
    #ifndef PNG_NO_WRITE_bKGD
    # define PNG_WRITE_bKGD_SUPPORTED
    # ifndef PNG_bKGD_SUPPORTED
    # define PNG_bKGD_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_cHRM
    # define PNG_WRITE_cHRM_SUPPORTED
    # ifndef PNG_cHRM_SUPPORTED
    # define PNG_cHRM_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_gAMA
    # define PNG_WRITE_gAMA_SUPPORTED
    # ifndef PNG_gAMA_SUPPORTED
    # define PNG_gAMA_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_hIST
    # define PNG_WRITE_hIST_SUPPORTED
    # ifndef PNG_hIST_SUPPORTED
    # define PNG_hIST_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_iCCP
    # define PNG_WRITE_iCCP_SUPPORTED
    # ifndef PNG_iCCP_SUPPORTED
    # define PNG_iCCP_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_iTXt
    # ifndef PNG_WRITE_iTXt_SUPPORTED
    # define PNG_WRITE_iTXt_SUPPORTED
    # endif
    # ifndef PNG_iTXt_SUPPORTED
    # define PNG_iTXt_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_oFFs
    # define PNG_WRITE_oFFs_SUPPORTED
    # ifndef PNG_oFFs_SUPPORTED
    # define PNG_oFFs_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_pCAL
    # define PNG_WRITE_pCAL_SUPPORTED
    # ifndef PNG_pCAL_SUPPORTED
    # define PNG_pCAL_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_sCAL
    # define PNG_WRITE_sCAL_SUPPORTED
    # ifndef PNG_sCAL_SUPPORTED
    # define PNG_sCAL_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_pHYs
    # define PNG_WRITE_pHYs_SUPPORTED
    # ifndef PNG_pHYs_SUPPORTED
    # define PNG_pHYs_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_sBIT
    # define PNG_WRITE_sBIT_SUPPORTED
    # ifndef PNG_sBIT_SUPPORTED
    # define PNG_sBIT_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_sPLT
    # define PNG_WRITE_sPLT_SUPPORTED
    # ifndef PNG_sPLT_SUPPORTED
    # define PNG_sPLT_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_sRGB
    # define PNG_WRITE_sRGB_SUPPORTED
    # ifndef PNG_sRGB_SUPPORTED
    # define PNG_sRGB_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_tEXt
    # define PNG_WRITE_tEXt_SUPPORTED
    # ifndef PNG_tEXt_SUPPORTED
    # define PNG_tEXt_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_tIME
    # define PNG_WRITE_tIME_SUPPORTED
    # ifndef PNG_tIME_SUPPORTED
    # define PNG_tIME_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_tRNS
    # define PNG_WRITE_tRNS_SUPPORTED
    # ifndef PNG_tRNS_SUPPORTED
    # define PNG_tRNS_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_zTXt
    # define PNG_WRITE_zTXt_SUPPORTED
    # ifndef PNG_zTXt_SUPPORTED
    # define PNG_zTXt_SUPPORTED
    # endif
    #endif
    #ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS
    # define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
    # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED
    # define PNG_UNKNOWN_CHUNKS_SUPPORTED
    # endif
    # ifndef PNG_NO_HANDLE_AS_UNKNOWN
    # ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
    # define PNG_HANDLE_AS_UNKNOWN_SUPPORTED
    # endif
    # endif
    #endif
    #if defined(PNG_WRITE_iTXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \
    defined(PNG_WRITE_zTXt_SUPPORTED)
    # define PNG_WRITE_TEXT_SUPPORTED
    # ifndef PNG_TEXT_SUPPORTED
    # define PNG_TEXT_SUPPORTED
    # endif
    #endif
    #endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */
    /* Turn this off to disable png_read_png() and
    * png_write_png() and leave the row_pointers member
    * out of the info structure.
    #ifndef PNG_NO_INFO_IMAGE
    # define PNG_INFO_IMAGE_SUPPORTED
    #endif
    /* need the time information for reading tIME chunks */
    #if defined(PNG_tIME_SUPPORTED)
    # if !defined(_WIN32_WCE)
    /* "time.h" functions are not supported on WindowsCE */
    # include <time.h>
    # endif
    #endif
    /* Some typedefs to get us started. These should be safe on most of the
    * common platforms. The typedefs should be at least as large as the
    * numbers suggest (a png_uint_32 must be at least 32 bits long), but they
    * don't have to be exactly that size. Some compilers dislike passing
    * unsigned shorts as function parameters, so you may be better off using
    * unsigned int for png_uint_16. Likewise, for 64-bit systems, you may
    * want to have unsigned int for png_uint_32 instead of unsigned long.
    typedef unsigned long png_uint_32;
    typedef long png_int_32;
    typedef unsigned short png_uint_16;
    typedef short png_int_16;
    typedef unsigned char png_byte;
    /* This is usually size_t. It is typedef'ed just in case you need it to
    change (I'm not sure if you will or not, so I thought I'd be safe) */
    #ifdef PNG_SIZE_T
    typedef PNG_SIZE_T png_size_t;
    # define png_sizeof(x) png_convert_size(sizeof (x))
    #else
    typedef size_t png_size_t;
    # define png_sizeof(x) sizeof (x)
    #endif
    /* The following is needed for medium model support. It cannot be in the
    * PNG_INTERNAL section. Needs modification for other compilers besides
    * MSC. Model independent support declares all arrays and pointers to be
    * large using the far keyword. The zlib version used must also support
    * model independent data. As of version zlib 1.0.4, the necessary changes
    * have been made in zlib. The USE_FAR_KEYWORD define triggers other
    * changes that are needed. (Tim Wegner)
    /* Separate compiler dependencies (problem here is that zlib.h always
    defines FAR. (SJT) */
    #ifdef __BORLANDC__
    # if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__)
    # define LDATA 1
    # else
    # define LDATA 0
    # endif
    /* GRR: why is Cygwin in here? Cygwin is not Borland C... */
    # if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__)
    # define PNG_MAX_MALLOC_64K
    # if (LDATA != 1)
    # ifndef FAR
    # define FAR __far
    # endif
    # define USE_FAR_KEYWORD
    # endif /* LDATA != 1 */
    /* Possibly useful for moving data out of default segment.
    * Uncomment it if you want. Could also define FARDATA as
    * const if your compiler supports it. (SJT)
    # define FARDATA FAR
    # endif /* __WIN32__, __FLAT__, __CYGWIN__ */
    #endif /* __BORLANDC__ */
    /* Suggest testing for specific compiler first before testing for
    * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM,
    * making reliance oncertain keywords suspect. (SJT)
    /* MSC Medium model */
    #if defined(FAR)
    # if defined(M_I86MM)
    # define USE_FAR_KEYWORD
    # define FARDATA FAR
    # include <dos.h>
    # endif
    #endif
    /* SJT: default case */
    #ifndef FAR
    # define FAR
    #endif
    /* At this point FAR is always defined */
    #ifndef FARDATA
    # define FARDATA
    #endif
    /* Typedef for floating-point numbers that are converted
    to fixed-point with a multiple of 100,000, e.g., int_gamma */
    typedef png_int_32 png_fixed_point;
    /* Add typedefs for pointers */
    typedef void FAR * png_voidp;
    typedef png_byte FAR * png_bytep;
    typedef png_uint_32 FAR * png_uint_32p;
    typedef png_int_32 FAR * png_int_32p;
    typedef png_uint_16 FAR * png_uint_16p;
    typedef png_int_16 FAR * png_int_16p;
    typedef PNG_CONST char FAR * png_const_charp;
    typedef char FAR * png_charp;
    typedef png_fixed_point FAR * png_fixed_point_p;
    #ifndef PNG_NO_STDIO
    #if defined(_WIN32_WCE)
    typedef HANDLE png_FILE_p;
    #else
    typedef FILE * png_FILE_p;
    #endif
    #endif
    #ifdef PNG_FLOATING_POINT_SUPPORTED
    typedef double FAR * png_doublep;
    #endif
    /* Pointers to pointers; i.e. arrays */
    typedef png_byte FAR * FAR * png_bytepp;
    typedef png_uint_32 FAR * FAR * png_uint_32pp;
    typedef png_int_32 FAR * FAR * png_int_32pp;
    typedef png_uint_16 FAR * FAR * png_uint_16pp;
    typedef png_int_16 FAR * FAR * png_int_16pp;
    typedef PNG_CONST char FAR * FAR * png_const_charpp;
    typedef char FAR * FAR * png_charpp;
    typedef png_fixed_point FAR * FAR * png_fixed_point_pp;
    #ifdef PNG_FLOATING_POINT_SUPPORTED
    typedef double FAR * FAR * png_doublepp;
    #endif
    /* Pointers to pointers to pointers; i.e., pointer to array */
    typedef char FAR * FAR * FAR * png_charppp;
    /* libpng typedefs for types in zlib. If zlib changes
    * or another compression library is used, then change these.
    * Eliminates need to change all the source files.
    typedef charf * png_zcharp;
    typedef charf * FAR * png_zcharpp;
    typedef z_stream FAR * png_zstreamp;
    * Define PNG_BUILD_DLL if the module being built is a Windows
    * LIBPNG DLL.
    * Define PNG_USE_DLL if you want to *link* to the Windows LIBPNG DLL.
    * It is equivalent to Microsoft predefined macro _DLL that is
    * automatically defined when you compile using the share
    * version of the CRT (C Run-Time library)
    * The cygwin mods make this behavior a little different:
    * Define PNG_BUILD_DLL if you are building a dll for use with cygwin
    * Define PNG_STATIC if you are building a static library for use with cygwin,
    * -or- if you are building an application that you want to link to the
    * static library.
    * PNG_USE_DLL is defined by default (no user action needed) unless one of
    * the other flags is defined.
    #if !defined(PNG_DLL) && (defined(PNG_BUILD_DLL) || defined(PNG_USE_DLL))
    # define PNG_DLL
    #endif
    /* If CYGWIN, then disallow GLOBAL ARRAYS unless building a static lib.
    * When building a static lib, default to no GLOBAL ARRAYS, but allow
    * command-line override
    #if defined(__CYGWIN__)
    # if !defined(PNG_STATIC)
    # if defined(PNG_USE_GLOBAL_ARRAYS)
    # undef PNG_USE_GLOBAL_ARRAYS
    # endif
    # if !defined(PNG_USE_LOCAL_ARRAYS)
    # define PNG_USE_LOCAL_ARRAYS
    # endif
    # else
    # if defined(PNG_USE_LOCAL_ARRAYS) || defined(PNG_NO_GLOBAL_ARRAYS)
    # if defined(PNG_USE_GLOBAL_ARRAYS)
    # undef PNG_USE_GLOBAL_ARRAYS
    # endif
    # endif
    # endif
    # if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS)
    # define PNG_USE_LOCAL_ARRAYS
    # endif
    #endif
    /* Do not use global arrays (helps with building DLL's)
    * They are no longer used in libpng itself, since version 1.0.5c,
    * but might be required for some pre-1.0.5c applications.
    #if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS)
    # if defined(PNG_NO_GLOBAL_ARRAYS) || (defined(__GNUC__) && defined(PNG_DLL))
    # define PNG_USE_LOCAL_ARRAYS
    # else
    # define PNG_USE_GLOBAL_ARRAYS
    # endif
    #endif
    #if defined(__CYGWIN__)
    # undef PNGAPI
    # define PNGAPI __cdecl
    # undef PNG_IMPEXP
    # define PNG_IMPEXP
    #endif
    /* If you define PNGAPI, e.g., with compiler option "-DPNGAPI=__stdcall",
    * you may get warnings regarding the linkage of png_zalloc and png_zfree.
    * Don't ignore those warnings; you must also reset the default calling
    * convention in your compiler to match your PNGAPI, and you must build
    * zlib and your applications the same way you build libpng.
    #if defined(__MINGW32__) && !defined(PNG_MODULEDEF)
    # ifndef PNG_NO_MODULEDEF
    # define PNG_NO_MODULEDEF
    # endif
    #endif
    #if !defined(PNG_IMPEXP) && defined(PNG_BUILD_DLL) && !defined(PNG_NO_MODULEDEF)
    # define PNG_IMPEXP
    #endif
    #if defined(PNG_DLL) || defined(_DLL) || defined(__DLL__ ) || \
    (( defined(_Windows) || defined(_WINDOWS) || \
    defined(WIN32) || defined(_WIN32) || defined(__WIN32__) ))
    # ifndef PNGAPI
    # if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800))
    # define PNGAPI __cdecl
    # else
    # define PNGAPI _cdecl
    # endif
    # endif
    # if !defined(PNG_IMPEXP) && (!defined(PNG_DLL) || \
    0 /* WINCOMPILER_WITH_NO_SUPPORT_FOR_DECLIMPEXP */)
    # define PNG_IMPEXP
    # endif
    # if !defined(PNG_IMPEXP)
    # define PNG_EXPORT_TYPE1(type,symbol) PNG_IMPEXP type PNGAPI symbol
    # define PNG_EXPORT_TYPE2(type,symbol) type PNG_IMPEXP PNGAPI symbol
    /* Borland/Microsoft */
    # if defined(_MSC_VER) || defined(__BORLANDC__)
    # if (_MSC_VER >= 800) || (__BORLANDC__ >= 0x500)
    # define PNG_EXPORT PNG_EXPORT_TYPE1
    # else
    # define PNG_EXPORT PNG_EXPORT_TYPE2
    # if defined(PNG_BUILD_DLL)
    # define PNG_IMPEXP __export
    # else
    # define PNG_IMPEXP /*__import */ /* doesn't exist AFAIK in
    VC++ */
    # endif /* Exists in Borland C++ for
    C++ classes (== huge) */
    # endif
    # endif
    # if !defined(PNG_IMPEXP)
    # if defined(PNG_BUILD_DLL)
    # define PNG_IMPEXP __declspec(dllexport)
    # else
    # define PNG_IMPEXP __declspec(dllimport)
    # endif
    # endif
    # endif /* PNG_IMPEXP */
    #else /* !(DLL || non-cygwin WINDOWS) */
    # if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__)
    # ifndef PNGAPI
    # define PNGAPI _System
    # endif
    # else
    # if 0 /* ... other platforms, with other meanings */
    # endif
    # endif
    #endif
    #ifndef PNGAPI
    # define PNGAPI
    #endif
    #ifndef PNG_IMPEXP
    # define PNG_IMPEXP
    #endif
    #ifndef PNG_EXPORT
    # define PNG_EXPORT(type,symbol) PNG_IMPEXP type PNGAPI symbol
    #endif
    #ifdef PNG_USE_GLOBAL_ARRAYS
    # ifndef PNG_EXPORT_VAR
    # define PNG_EXPORT_VAR(type) extern PNG_IMPEXP type
    # endif
    #endif
    /* User may want to use these so they are not in PNG_INTERNAL. Any library
    * functions that are passed far data must be model independent.
    #ifndef PNG_ABORT
    # define PNG_ABORT() abort()
    #endif
    #ifdef PNG_SETJMP_SUPPORTED
    # define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf)
    #else
    # define png_jmpbuf(png_ptr) \
    (LIBPNG_WAS_COMPILED_WITH__PNG_SETJMP_NOT_SUPPORTED)
    #endif
    #if defined(USE_FAR_KEYWORD) /* memory model independent fns */
    /* use this to make far-to-near assignments */
    # define CHECK 1
    # define NOCHECK 0
    # define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK))
    # define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK))
    # define png_strcpy _fstrcpy
    # define png_strncpy _fstrncpy /* Added to v 1.2.6 */
    # define png_strlen _fstrlen
    # define png_memcmp _fmemcmp /* SJT: added */
    # define png_memcpy _fmemcpy
    # define png_memset _fmemset
    #else /* use the usual functions */
    # define CVT_PTR(ptr) (ptr)
    # define CVT_PTR_NOCHECK(ptr) (ptr)
    # define png_strcpy strcpy
    # define png_strncpy strncpy /* Added to v 1.2.6 */
    # define png_strlen strlen
    # define png_memcmp memcmp /* SJT: added */
    # define png_memcpy memcpy
    # define png_memset memset
    #endif
    /* End of memory model independent support */
    /* Just a little check that someone hasn't tried to define something
    * contradictory.
    #if (PNG_ZBUF_SIZE > 65536L) && defined(PNG_MAX_MALLOC_64K)
    # undef PNG_ZBUF_SIZE
    # define PNG_ZBUF_SIZE 65536L
    #endif
    #ifdef PNG_READ_SUPPORTED
    /* Prior to libpng-1.0.9, this block was in pngasmrd.h */
    #if defined(PNG_INTERNAL)
    /* These are the default thresholds before the MMX code kicks in; if either
    * rowbytes or bitdepth is below the threshold, plain C code is used. These
    * can be overridden at runtime via the png_set_mmx_thresholds() call in
    * libpng 1.2.0 and later. The values below were chosen by Intel.
    #ifndef PNG_MMX_ROWBYTES_THRESHOLD_DEFAULT
    # define PNG_MMX_ROWBYTES_THRESHOLD_DEFAULT 128 /* >= */
    #endif
    #ifndef PNG_MMX_BITDEPTH_THRESHOLD_DEFAULT
    # define PNG_MMX_BITDEPTH_THRESHOLD_DEFAULT 9 /* >= */
    #endif
    /* Set this in the makefile for VC++ on Pentium, not here. */
    /* Platform must be Pentium. Makefile must assemble and load pngvcrd.c .
    * MMX will be detected at run time and used if present.
    #ifdef PNG_USE_PNGVCRD
    # define PNG_HAVE_ASSEMBLER_COMBINE_ROW
    # define PNG_HAVE_ASSEMBLER_READ_INTERLACE
    # define PNG_HAVE_ASSEMBLER_READ_FILTER_ROW
    #endif
    /* Set this in the makefile for gcc/as on Pentium, not here. */
    /* Platform must be Pentium. Makefile must assemble and load pnggccrd.c .
    * MMX will be detected at run time and used if present.
    #ifdef PNG_USE_PNGGCCRD
    # define PNG_HAVE_ASSEMBLER_COMBINE_ROW
    # define PNG_HAVE_ASSEMBLER_READ_INTERLACE
    # define PNG_HAVE_ASSEMBLER_READ_FILTER_ROW
    #endif
    /* - see pnggccrd.c for info about what is currently enabled */
    #endif /* PNG_INTERNAL */
    #endif /* PNG_READ_SUPPORTED */
    #endif /* PNGCONF_H */

    First, I agree with Karol, use the AUR so that pacman can do its job.  Second, when you do your make, there is no reason to run it as root (until you do the make install)  For the initial build, it is much safer to not use root; plus all the files in your home directory will continue to belong to use, not to root.
    But, try the AUR.

  • BDB vxworks 6.6 kernel port error

    Hello,
    I have Berkeley DB 4.7.25 compiled in kernel. When I try the example in txn_guide.c, I have got the following error:
    Error opening environment: S_dosFsLib_FILE_NOT_FOUND
    I'm all done.
    value = 10 = 0xa
    I traced the source code it fails in __rep_reset_init() when it tries to open file __db.rep.init. How can I fix this? Thanks.
    Allan
    #ifdef HAVE_REPLICATION
              if ((ret = __rep_reset_init(env)) != 0 ||
              (ret = __env_remove_env(env)) != 0 ||
    #else
    Have I missed anything? Thanks.
    /* File: txn_guide.c */
    /* We assume an ANSI-compatible compiler */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <db.h>
    #ifdef _WIN32
    #include <windows.h>
    #define     PATHD '\\'
    extern int getopt(int, char * const *, const char *);
    extern char *optarg;
    typedef HANDLE thread_t;
    #define     thread_create(thrp, attr, func, arg) \
    (((*(thrp) = CreateThread(NULL, 0, \
         (LPTHREAD_START_ROUTINE)(func), (arg), 0, NULL)) == NULL) ? -1 : 0)
    #define     thread_join(thr, statusp) \
    ((WaitForSingleObject((thr), INFINITE) == WAIT_OBJECT_0) && \
    GetExitCodeThread((thr), (LPDWORD)(statusp)) ? 0 : -1)
    typedef HANDLE mutex_t;
    #define     mutex_init(m, attr) \
    (((*(m) = CreateMutex(NULL, FALSE, NULL)) != NULL) ? 0 : -1)
    #define     mutex_lock(m) \
    ((WaitForSingleObject(*(m), INFINITE) == WAIT_OBJECT_0) ? 0 : -1)
    #define     mutex_unlock(m) (ReleaseMutex(*(m)) ? 0 : -1)
    #else
    #include <pthread.h>
    #include <unistd.h>
    #define     PATHD '/'
    typedef pthread_t thread_t;
    #define     thread_create(thrp, attr, func, arg) \
    pthread_create((thrp), (attr), (func), (arg))
    #define     thread_join(thr, statusp) pthread_join((thr), (statusp))
    typedef pthread_mutex_t mutex_t;
    #define     mutex_init(m, attr) pthread_mutex_init((m), (attr))
    #define     mutex_lock(m) pthread_mutex_lock(m)
    #define     mutex_unlock(m) pthread_mutex_unlock(m)
    #endif
    /* Run 5 writers threads at a time. */
    #define     NUMWRITERS 5
    * Printing of a thread_t is implementation-specific, so we
    * create our own thread IDs for reporting purposes.
    int global_thread_num;
    mutex_t thread_num_lock;
    /* Forward declarations */
    int count_records(DB *, DB_TXN *);
    int open_db(DB **, const char *, const char *, DB_ENV *, u_int32_t);
    int usage(void);
    void writer_thread(void );
    /* Usage function */
    int
    usage()
    fprintf(stderr, " [-h <database_home_directory>]\n");
    return (EXIT_FAILURE);
    #if 0
    int
    main(int argc, char *argv[])
    /* Initialize our handles */
    DB *dbp = NULL;
    DB_ENV *envp = NULL;
    thread_t writer_threads[NUMWRITERS];
    int ch, i, ret, ret_t;
    u_int32_t env_flags;
    char *db_home_dir;
    /* Application name */
    const char *prog_name = "txn_guide";
    /* Database file name */
    const char *file_name = "mydb.db";
    /* Parse the command line arguments */
    #ifdef _WIN32
    db_home_dir = ".\\";
    #else
    db_home_dir = "./";
    #endif
    while ((ch = getopt(argc, argv, "h:")) != EOF)
         switch (ch) {
         case 'h':
         db_home_dir = optarg;
         break;
         case '?':
         default:
         return (usage());
    #endif
    void myDbTest(char *home)
         /* Initialize our handles */
         DB *dbp = NULL;
         DB_ENV *envp = NULL;
         thread_t writer_threads[NUMWRITERS];
         int ch, i, ret, ret_t;
         u_int32_t env_flags;
         char *db_home_dir;
         /* Application name */
         const char *prog_name = "txn_guide";
         /* Database file name */
         const char *file_name = "mydb.db";
         /* Parse the command line arguments */
         #ifdef _WIN32
         db_home_dir = ".\\";
         #else
         db_home_dir = "./";
         #endif     
    db_home_dir = home;
    /* Create the environment */
    ret = db_env_create(&envp, 0);
    if (ret != 0) {
         fprintf(stderr, "Error creating environment handle: %s\n",
         db_strerror(ret));
         goto err;
    * Indicate that we want db to perform lock detection internally.
    * Also indicate that the transaction with the fewest number of
    * write locks will receive the deadlock notification in
    * the event of a deadlock.
    ret = envp->set_lk_detect(envp, DB_LOCK_MINWRITE);
    if (ret != 0) {
         fprintf(stderr, "Error setting lock detect: %s\n",
         db_strerror(ret));
         goto err;
    envp->set_shm_key(envp, 10);
    env_flags =
    DB_CREATE | /* Create the environment if it does not exist */
    DB_RECOVER | /* Run normal recovery. */
    DB_INIT_LOCK | /* Initialize the locking subsystem */
    DB_INIT_LOG | /* Initialize the logging subsystem */
    DB_INIT_TXN | /* Initialize the transactional subsystem. This
                   * also turns on logging. */
    DB_INIT_MPOOL | /* Initialize the memory pool (in-memory cache) */
    DB_THREAD; /* Cause the environment to be free-threaded */
    /* Now actually open the environment */
    ret = envp->open(envp, db_home_dir, env_flags, 0);
    if (ret != 0) {
         fprintf(stderr, "Error opening environment: %s\n",
         db_strerror(ret));
         goto err;
    * If we had utility threads (for running checkpoints or
    * deadlock detection, for example) we would spawn those
    * here. However, for a simple example such as this,
    * that is not required.
    /* Open the database */
    ret = open_db(&dbp, prog_name, file_name,
    envp, DB_DUPSORT);
    if (ret != 0)
         goto err;
    /* Initialize a mutex. Used to help provide thread ids. */
    (void)mutex_init(&thread_num_lock, NULL);
    /* Start the writer threads. */
    for (i = 0; i < NUMWRITERS; i++)
         (void)thread_create(
         &writer_threads, NULL, writer_thread, (void *)dbp);
    /* Join the writers */
    for (i = 0; i < NUMWRITERS; i++)
         (void)thread_join(writer_threads[i], NULL);
    err:
    /* Close our database handle, if it was opened. */
    if (dbp != NULL) {
         ret_t = dbp->close(dbp, 0);
         if (ret_t != 0) {
         fprintf(stderr, "%s database close failed: %s\n",
              file_name, db_strerror(ret_t));
         ret = ret_t;
    /* Close our environment, if it was opened. */
    if (envp != NULL) {
         ret_t = envp->close(envp, 0);
         if (ret_t != 0) {
         fprintf(stderr, "environment close failed: %s\n",
              db_strerror(ret_t));
              ret = ret_t;
    /* Final status message and return. */
    printf("I'm all done.\n");
    return (ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
    * A function that performs a series of writes to a
    * Berkeley DB database. The information written
    * to the database is largely nonsensical, but the
    * mechanism of transactional commit/abort and
    * deadlock detection is illustrated here.
    void *
    writer_thread(void *args)
    static char *key_strings[] = {
         "key 1", "key 2", "key 3", "key 4", "key 5",
         "key 6", "key 7", "key 8", "key 9", "key 10"
    DB *dbp;
    DB_ENV *envp;
    DBT key, value;
    DB_TXN *txn;
    int i, j, payload, ret, thread_num;
    int retry_count, max_retries = 20; /* Max retry on a deadlock */
    dbp = (DB *)args;
    envp = dbp->get_env(dbp);
    /* Get the thread number */
    (void)mutex_lock(&thread_num_lock);
    global_thread_num++;
    thread_num = global_thread_num;
    (void)mutex_unlock(&thread_num_lock);
    /* Initialize the random number generator */
    srand(thread_num);
    /* Write 50 times and then quit */
    for (i = 0; i < 50; i++) {
         retry_count = 0; /* Used for deadlock retries */
         * Some think it is bad form to loop with a goto statement, but
         * we do it anyway because it is the simplest and clearest way
         * to achieve our abort/retry operation.
    retry:
         /* Begin our transaction. We group multiple writes in
         * this thread under a single transaction so as to
         * (1) show that you can atomically perform multiple writes
         * at a time, and (2) to increase the chances of a
         * deadlock occurring so that we can observe our
         * deadlock detection at work.
         * Normally we would want to avoid the potential for deadlocks,
         * so for this workload the correct thing would be to perform our
         * puts with autocommit. But that would excessively simplify our
         * example, so we do the "wrong" thing here instead.
         ret = envp->txn_begin(envp, NULL, &txn, 0);
         if (ret != 0) {
         envp->err(envp, ret, "txn_begin failed");
         return ((void *)EXIT_FAILURE);
         for (j = 0; j < 10; j++) {
         /* Set up our key and values DBTs */
         memset(&key, 0, sizeof(DBT));
         key.data = key_strings[j];
         key.size = (u_int32_t)strlen(key_strings[j]) + 1;
         memset(&value, 0, sizeof(DBT));
         payload = rand() + i;
         value.data = &payload;
         value.size = sizeof(int);
         /* Perform the database put. */
         switch (ret = dbp->put(dbp, txn, &key, &value, 0)) {
              case 0:
              break;
              * Our database is configured for sorted duplicates,
              * so there is a potential for a KEYEXIST error return.
              * If we get one, simply ignore it and continue on.
              * Note that you will see KEYEXIST errors only after you
              * have run this program at least once.
              case DB_KEYEXIST:
              printf("Got keyexists.\n");
              break;
              * Here's where we perform deadlock detection. If
              * DB_LOCK_DEADLOCK is returned by the put operation,
              * then this thread has been chosen to break a deadlock.
              * It must abort its operation, and optionally retry the
              * put.
              case DB_LOCK_DEADLOCK:
              * First thing that we MUST do is abort the
              * transaction.
              (void)txn->abort(txn);
              * Now we decide if we want to retry the operation.
              * If we have retried less than max_retries,
              * increment the retry count and goto retry.
              if (retry_count < max_retries) {
                   printf("Writer %i: Got DB_LOCK_DEADLOCK.\n",
                   thread_num);
                   printf("Writer %i: Retrying write operation.\n",
                   thread_num);
                   retry_count++;
                   goto retry;
              * Otherwise, just give up.
              printf("Writer %i: ", thread_num);
              printf("Got DB_LOCK_DEADLOCK and out of retries.\n");
              printf("Writer %i: Giving up.\n", thread_num);
              return ((void *)EXIT_FAILURE);
              * If a generic error occurs, we simply abort the
              * transaction and exit the thread completely.
              default:
              envp->err(envp, ret, "db put failed");
              ret = txn->abort(txn);
              if (ret != 0)
                   envp->err(envp, ret,
                   "txn abort failed");
              return ((void *)EXIT_FAILURE);
         } /** End case statement **/
         } /** End for loop **/
         * print the number of records found in the database.
         * See count_records() for usage information.
         printf("Thread %i. Record count: %i\n", thread_num,
         count_records(dbp, NULL));
         * If all goes well, we can commit the transaction and
         * exit the thread.
         ret = txn->commit(txn, 0);
         if (ret != 0) {
         envp->err(envp, ret, "txn commit failed");
         return ((void *)EXIT_FAILURE);
    return ((void *)EXIT_SUCCESS);
    * This simply counts the number of records contained in the
    * database and returns the result. You can use this function
    * in three ways:
    * First call it with an active txn handle.
    * Secondly, configure the cursor for uncommitted reads (this
    * is what the example currently does).
    * Third, call count_records AFTER the writer has committed
    * its transaction.
    * If you do none of these things, the writer thread will
    * self-deadlock.
    * Note that this function exists only for illustrative purposes.
    * A more straight-forward way to count the number of records in
    * a database is to use DB->stat() or DB->stat_print().
    int
    count_records(DB dbp, DB_TXN txn)
    DBT key, value;
    DBC *cursorp;
    int count, ret;
    cursorp = NULL;
    count = 0;
    /* Get the cursor */
    ret = dbp->cursor(dbp, txn, &cursorp,
         DB_READ_UNCOMMITTED);
    if (ret != 0) {
         dbp->err(dbp, ret,
         "count_records: cursor open failed.");
         goto cursor_err;
    /* Get the key DBT used for the database read */
    memset(&key, 0, sizeof(DBT));
    memset(&value, 0, sizeof(DBT));
    do {
         ret = cursorp->get(cursorp, &key, &value, DB_NEXT);
         switch (ret) {
         case 0:
              count++;
              break;
         case DB_NOTFOUND:
              break;
         default:
              dbp->err(dbp, ret,
              "Count records unspecified error");
              goto cursor_err;
    } while (ret == 0);
    cursor_err:
    if (cursorp != NULL) {
         ret = cursorp->close(cursorp);
         if (ret != 0) {
         dbp->err(dbp, ret,
              "count_records: cursor close failed.");
    return (count);
    /* Open a Berkeley DB database */
    int
    open_db(DB **dbpp, const char progname, const char file_name,
    DB_ENV *envp, u_int32_t extra_flags)
    int ret;
    u_int32_t open_flags;
    DB *dbp;
    /* Initialize the DB handle */
    ret = db_create(&dbp, envp, 0);
    if (ret != 0) {
         fprintf(stderr, "%s: %s\n", progname,
              db_strerror(ret));
         return (EXIT_FAILURE);
    /* Point to the memory malloc'd by db_create() */
    *dbpp = dbp;
    if (extra_flags != 0) {
         ret = dbp->set_flags(dbp, extra_flags);
         if (ret != 0) {
         dbp->err(dbp, ret,
              "open_db: Attempt to set extra flags failed.");
         return (EXIT_FAILURE);
    /* Now open the database */
    open_flags = DB_CREATE | /* Allow database creation */
              DB_READ_UNCOMMITTED | /* Allow dirty reads */
              DB_AUTO_COMMIT; /* Allow autocommit */
    ret = dbp->open(dbp, /* Pointer to the database */
              NULL, /* Txn pointer */
              file_name, /* File name */
              NULL, /* Logical db name */
              DB_BTREE, /* Database type (using btree) */
              open_flags, /* Open flags */
              0); /* File mode. Using defaults */
    if (ret != 0) {
         dbp->err(dbp, ret, "Database '%s' open failed",
         file_name);
         return (EXIT_FAILURE);
    return (EXIT_SUCCESS);

    More information: After I create the DB, DB put works fine. The db_stat is OK.
    After reboot the processor, db_stat gives error. After running db_recover, it gives errors.
    Before reboot:
    -> ls
    CfgDbEr.log
    __db.001
    log.0000000001
    OpvCfg.db
    value = 0 = 0x0
    -> db_stat "-h /bk1/db -d OpvCfg.db"
    THU AUG 14 18:12:23 2008 Local time
    53162 Btree magic number
    9 Btree version number
    Big-endian Byte order
    Flags
    2 Minimum keys per-page
    4096 Underlying database page size
    1007 Overflow key/data size
    1 Number of levels in the tree
    1 Number of unique keys in the tree
    1 Number of data items in the tree
    0 Number of tree internal pages
    0 Number of bytes free in tree internal pages (0% ff)
    1 Number of tree leaf pages
    4058 Number of bytes free in tree leaf pages (0% ff)
    0 Number of tree duplicate pages
    0 Number of bytes free in tree duplicate pages (0% ff)
    0 Number of tree overflow pages
    0 Number of bytes free in tree overflow pages (0% ff)
    0 Number of empty pages
    0 Number of pages on the free list
    value = 0 = 0x0
    After reboot, it points out error:segment /bk1/db/__db.001 does not exist
    -> db_stat "-h /bk1/db -d OpvCfg.db"
    db_stat: segment /bk1/db/__db.001 does not exist
    THU JAN 01 00:01:32 1970 Local time
    53162 Btree magic number
    9 Btree version number
    Big-endian Byte order
    Flags
    2 Minimum keys per-page
    4096 Underlying database page size
    1007 Overflow key/data size
    1 Number of levels in the tree
    1 Number of unique keys in the tree
    1 Number of data items in the tree
    0 Number of tree internal pages
    0 Number of bytes free in tree internal pages (0% ff)
    1 Number of tree leaf pages
    4058 Number of bytes free in tree leaf pages (0% ff)
    0 Number of tree duplicate pages
    0 Number of bytes free in tree duplicate pages (0% ff)
    0 Number of tree overflow pages
    0 Number of bytes free in tree overflow pages (0% ff)
    0 Number of empty pages
    0 Number of pages on the free list
    value = 0 = 0x0
    The result of running db_recover:
    db_recover "-c -h /bk1/db"db_recover: segment /bk1/db/__db.001 does not exist
    db_recover: /bk1/db/log.0000000002: log file unreadable: S_dosFsLib_FILE_NOT_FOU
    ND
    db_recover: PANIC: S_dosFsLib_FILE_NOT_FOUND
    db_recover: PANIC: fatal region error detected; run recovery
    db_recover: dbenv->close: DB_RUNRECOVERY: Fatal error, run database recovery
    value = 1 = 0x1

  • How to create a Custom UIView and How to instantiate that ?

    How to create a Custom UIView and How to instantiate that ?
    In Flash, all we need to do is create a MovieClip and assign it a class name in the library.
    Instantiation is a simple matter of:
    var newclass:CustomClass = new CustomClass({initialization_data:1652});
    addChild(newclass);
    At this current point in time, my understanding of creating custom UIView in xcode is limited to the understanding that you have to:
    1: Forward declare the class in the header.
    2:
    ]newclass *CustomClass in @interface's {}
    and THEN
    @property (nonatomic, retain) newclass *CustomClass;
    in the header file also.
    3: Nib initialization in the implementation file in viewDidLoad and do "addSubview".
    ==============================
    Based on my limited understanding at this point, I find the need to
    @property (nonatomic, retain) newclass *CustomClass;
    at the header somewhat limiting...as it denotes you must know how many instance you will create in the application before hand.
    I believe I am wrong here, hence, my question is, how do I add custom UIViews with initialization codes in real time ?

    hi,
    one workaround i could think of is using the CM views to search for content that belongs to a category and display it in a custom way.
    http://www.oracle.com/technology/products/ias/portal/html/plsqldoc/pldoc904/wwsbr_api_view.html
    this only allows you to search for the meta-data available in the CM views but not the content of an item that is available when doing a search.
    in the next major portal release we will have a publich search API that can be used for these type of requirements. you can execute your search and format the results in the way you want.
    regards,
    christian

  • Deep DDIC-Structure - Method to get the Comp.Type of a sub-structure

    Dear colleagues,
    thought the subsequent piece of coding might be helpful for the following problem:
    In DDIC you have created a deep/nested Structure e.g. a complete Business Document representation like
    s_doc_header type struct_doc_header
         (incl.) item  type tab_item
            (incl) party type tab_party etc.
    Now for some purpose you need to access somewhere a sub-part of this structure, e.g. the party-part. You only know (dynamically) the component name "party", but need for dynamic access also the Component Type ("tab_party") (in order to make use of  a "CREATE DATA lr_reftodata TYPE (determined_comp_type)." )
    The following piece of coding should help to query any start component type (here "struct_doc_header") for its embedded components.
    Its a recursive use of features provided by the very nice class(set) of cl_abap_structdescr.
    I implemented it as a static method.
    When doing so, you need to ensure, that the TYPE-GROUP "ABAP" is linked to the class (class properties --> forward declarations),
    Let me know if you find it useful.
    And apologies in advance, if the same problem was already posted in the forum. I did only a rough search before due to a lag of ideas for appropriate search-strings ...
    Best regards,
    Rudy
    Signature:
    Importing:
    IV_COMPNAME     TYPE ABAP_COMPNAME
    IV_START_STRUCTR     TYPE KOMP_TYPE
    Exporting/returning
    EV_DDIC_STRUCT     TYPE KOMP_TYPE
    METHOD search_deep_ddic_by_comp.
    * Description      -------------------------------------------
    *  Methods looks into a deep DDIC-Structure and returns the
    *  corresponding TYPE
    *  Prerequsite for usage: Structures component names are unique.
    * Local Data Defintions --------------------------------------
    * Locals -----------------------------------------------------
    * TYPES:
      DATA: lv_compname                 TYPE abap_compname.
      DATA: lt_componenttable           TYPE abap_component_tab.
      DATA: lv_relative_name            TYPE string.
      DATA: lv_ddic_header                  TYPE x030l.
      DATA: lv_ddic_struct              TYPE komp_type.
      DATA: lv_start_struct             TYPE komp_type.
    * supporting
      DATA: lv_lines                    TYPE i.
      DATA: lv_message                  TYPE string.
      DATA: lt_selopt                   TYPE sesf_selection_parameters_tab.
      DATA: ls_selopt                   TYPE sesf_selection_parameter.
    * References -------------------------------------------------
      DATA: lo_struct_descr             TYPE REF TO cl_abap_structdescr.
      DATA: lo_type_descr               TYPE REF TO cl_abap_typedescr.
    * Field-Symbols ----------------------------------------------
      FIELD-SYMBOLS:
            <fs_struct_descr_component> TYPE abap_componentdescr.
      lo_struct_descr ?= cl_abap_structdescr=>describe_by_name( p_name = iv_start_structr ).
      IF lo_struct_descr IS BOUND.
    *   get all sub-structures/components of iv_start_structr
        CALL METHOD lo_struct_descr->get_components
          RECEIVING
            p_result = lt_componenttable.
        lv_compname = iv_compname.
        READ TABLE lt_componenttable ASSIGNING <fs_struct_descr_component>
                                               WITH KEY  name = lv_compname.
        IF sy-subrc = 0.
    *     matching component found - search for DDIC structure
          CALL METHOD <fs_struct_descr_component>-type->get_relative_name
            RECEIVING
              p_relative_name = lv_relative_name.
          ASSERT lv_relative_name IS NOT INITIAL.
          CASE <fs_struct_descr_component>-type->type_kind.
            WHEN 'u' OR 'v'. "structure
              ev_ddic_struct = lv_relative_name.
              RETURN.
            WHEN 'h'. "table type - derive the line type
              lo_type_descr ?= cl_abap_datadescr=>describe_by_name( p_name = lv_relative_name ).
              CALL METHOD lo_type_descr->get_ddic_header
                RECEIVING
                  p_header = lv_ddic_header.
              IF sy-subrc = 0.
                ev_ddic_struct   = lv_ddic_header-refname.
                RETURN.
              ELSE.
                "error
              ENDIF.
            WHEN OTHERS.
              "error
          ENDCASE.
        ELSE.
    *     go deeper into structure and look into each sub-structure via recursion
          LOOP AT lt_componenttable ASSIGNING <fs_struct_descr_component>.
            CALL METHOD <fs_struct_descr_component>-type->get_relative_name
              RECEIVING
                p_relative_name = lv_relative_name.
            ASSERT lv_relative_name IS NOT INITIAL.
            CASE <fs_struct_descr_component>-type->type_kind.
              WHEN 'u' OR 'v'. "structure
              WHEN 'h'. "table type - derive the line type
                lo_type_descr ?= cl_abap_datadescr=>describe_by_name( p_name = lv_relative_name ).
                CALL METHOD lo_type_descr->get_ddic_header
                  RECEIVING
                    p_header = lv_ddic_header.
                IF sy-subrc = 0.
                  lv_relative_name = lv_ddic_header-refname.
                ELSE.
                  "error
                ENDIF.
              WHEN OTHERS.
                EXIT. "next loop, investigate only struct and table
            ENDCASE.
    *        lv_compname     = <fs_struct_descr_component>-name.
            lv_start_struct = lv_relative_name.
            CALL METHOD /scmtms/cl_ddic_utility=>search_deep_ddic_by_comp
              EXPORTING
                iv_compname      = iv_compname
                iv_start_structr = lv_start_struct
              IMPORTING
                ev_ddic_struct   = lv_ddic_struct.
            IF lv_ddic_struct IS NOT INITIAL.
              ev_ddic_struct = lv_ddic_struct.
              EXIT.
            ENDIF.
          ENDLOOP.
        ENDIF.
      ENDIF.
    ENDMETHOD.

    Using command:
    ASSIGN COMPONENT idx OF STRUCTURE struc TO <fs>.
    For example:
    DESCRIBE FIELD pi_output TYPE pi_output COMPONENTS lv_columns. "For number of columns
    DO lv_columns TIMES.
    ASSIGN COMPONENT SY-INDEX OF
    STRUCTURE (name of structure) TO <l_fs_output>. "<l_fs_output> - field of structure
    DESCRIBE FIELD <l_fs_output>... "with other options.
    ENDDO.

Maybe you are looking for

  • Multiple Rows Update / Refresh Toplink Query when database trigger involved

    Hi everybody! I have two easy troubles for you; the platform is the same as the SRDemo Toplink version. 1.     Multiple Rows Update: I want to update with mergeEntity method, multiple rows for an isolated table; that method receives a parameter that

  • Cost center in Sales Order/Credit memo request

    Hi SAP Gurus, There is a requirement from our client. They are processing Credit Memo from SD VF01 via Credit memo request. The want to assign Cost center in the line items which is greyed out at the time of processing in VF01. I also verified in the

  • Ibooks author font change

    When opening up an iBA file, some of my text's fonts have been changed. (I did not change them). The last time I saved my file, the text and formatting was correct, but when I opened the file again, some of my text is now messed up because iBooks Aut

  • How do you fix the itunes R6034 error

    How do you fix the R6034 error with itunes?

  • Problem in SPNego???

    Hi all, i am trying to implement SPNego on my server, the steps i have done are 1)Deployed EARs &#56256;&#56452; sap.comtcsecauthjmx~ear.ear &#56256;&#56452; sap.comtcsecauthspnego~wizard.ear &#56256;&#56452; security_example.ear 2)Created a service