richter     02/01/24 23:04:32

  Modified:    .        Tag: Embperl2c Embperl.pm Embperl.xs Old.xs ep.h
                        epdat2.h epinit.c epio.c epmain.c eppriv.h
                        eppublic.h
               Embperl  Tag: Embperl2c Util.pm
  Log:
  add output object
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.118.4.81 +15 -3     embperl/Embperl.pm
  
  Index: Embperl.pm
  ===================================================================
  RCS file: /home/cvs/embperl/Embperl.pm,v
  retrieving revision 1.118.4.80
  retrieving revision 1.118.4.81
  diff -u -r1.118.4.80 -r1.118.4.81
  --- Embperl.pm        24 Jan 2002 08:37:05 -0000      1.118.4.80
  +++ Embperl.pm        25 Jan 2002 07:04:30 -0000      1.118.4.81
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: Embperl.pm,v 1.118.4.80 2002/01/24 08:37:05 richter Exp $
  +#   $Id: Embperl.pm,v 1.118.4.81 2002/01/25 07:04:30 richter Exp $
   #
   ###################################################################################
   
  @@ -58,6 +58,8 @@
   
   1 ;
   
  
+#######################################################################################
  +
   sub Execute
       
       {
  @@ -66,8 +68,7 @@
   
       local $SIG{__WARN__} = \&Warn ;
   
  -    my $r = Embperl::Req::RunRequest (undef, $param) ;
  -
  +    Embperl::Req::RunRequest (undef, $param) ;
       }
   
   
#######################################################################################
  @@ -99,6 +100,17 @@
       { 
       eval 'use Apache::Constants qw(&OPT_EXECCGI &DECLINED &OK &FORBIDDEN)' ;
       die "use Apache::Constants failed: $@" if ($@); 
  +    }
  +
  
+#######################################################################################
  +
  +sub ExecuteComponent
  +    
  +    {
  +    my $rc ;
  +    my $param = shift ;
  +
  +    Embperl::Req::RunComponent ($Embperl::req, $param) ;
       }
   
   
#######################################################################################
  
  
  
  1.29.4.42 +6 -0      embperl/Embperl.xs
  
  Index: Embperl.xs
  ===================================================================
  RCS file: /home/cvs/embperl/Embperl.xs,v
  retrieving revision 1.29.4.41
  retrieving revision 1.29.4.42
  diff -u -r1.29.4.41 -r1.29.4.42
  --- Embperl.xs        24 Jan 2002 08:37:05 -0000      1.29.4.41
  +++ Embperl.xs        25 Jan 2002 07:04:30 -0000      1.29.4.42
  @@ -65,6 +65,12 @@
       RETVAL
   
   
  +int
  +embperl_RunComponent(pReq, pPerlParam)
  +    tReq * pReq;
  +    SV * pPerlParam
  +
  +
   
   INCLUDE: Old.xs
   
  
  
  
  1.1.2.4   +0 -8      embperl/Attic/Old.xs
  
  Index: Old.xs
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/Old.xs,v
  retrieving revision 1.1.2.3
  retrieving revision 1.1.2.4
  diff -u -r1.1.2.3 -r1.1.2.4
  --- Old.xs    23 Jan 2002 15:09:00 -0000      1.1.2.3
  +++ Old.xs    25 Jan 2002 07:04:31 -0000      1.1.2.4
  @@ -21,14 +21,6 @@
       RETVAL
   
   
  -int
  -embperl_ResetHandler(pReqSV)
  -    SV * pReqSV
  -CODE:
  -    RETVAL = ResetHandler(pReqSV) ;
  -OUTPUT:
  -    RETVAL
  -
   
   
   #if defined (__GNUC__) && defined (__i386__)
  
  
  
  1.27.4.38 +1 -1      embperl/ep.h
  
  Index: ep.h
  ===================================================================
  RCS file: /home/cvs/embperl/ep.h,v
  retrieving revision 1.27.4.37
  retrieving revision 1.27.4.38
  diff -u -r1.27.4.37 -r1.27.4.38
  --- ep.h      18 Jan 2002 16:22:36 -0000      1.27.4.37
  +++ ep.h      25 Jan 2002 07:04:31 -0000      1.27.4.38
  @@ -326,7 +326,7 @@
   
   int OpenOutput (/*i/o*/ register req * r,
                        /*in*/ const char *  sFilename) ;
  -int CloseOutput (/*i/o*/ register req * r) ;
  +int CloseOutput (/*i/o*/ tReq *             r, tComponentOutput * pOutput) ;
   int owrite (/*i/o*/ register req * r,
                        /*in*/ const void * ptr, 
                           /*in*/ size_t size) ;
  
  
  
  1.1.2.16  +28 -20    embperl/Attic/epdat2.h
  
  Index: epdat2.h
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epdat2.h,v
  retrieving revision 1.1.2.15
  retrieving revision 1.1.2.16
  diff -u -r1.1.2.15 -r1.1.2.16
  --- epdat2.h  24 Jan 2002 08:37:05 -0000      1.1.2.15
  +++ epdat2.h  25 Jan 2002 07:04:31 -0000      1.1.2.16
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epdat2.h,v 1.1.2.15 2002/01/24 08:37:05 richter Exp $
  +#   $Id: epdat2.h,v 1.1.2.16 2002/01/25 07:04:31 richter Exp $
   #
   
###################################################################################*/
   
  @@ -143,6 +143,7 @@
       char *  sSub ;            /* subroutine to call */
       int     nImport ;
       int     nFirstLine ;
  +    int     nMtime ;        /**< last modification time of pInput */
       } tComponentParam ;
   
   
  @@ -187,6 +188,31 @@
       } tApp ;
   
   
  +typedef struct tComponentOutput
  +    {
  +    SV *    _perlsv ;         /**< The perl reference to this structure */
  +    tMemPool *         pPool ;  /**< pool for memorymanagement */
  +
  +    bool    bDisableOutput ;   /* no output is generated */
  +
  +    struct tBuf *   pFirstBuf  ;    /* First buffer */
  +    struct tBuf *   pLastBuf   ;    /* Last written buffer */
  +    struct tBuf *   pFreeBuf   ;    /* List of unused buffers */
  +    struct tBuf *   pLastFreeBuf ;  /* End of list of unused buffers */
  +
  +    char *          pMemBuf ;            /* temporary output */
  +    char *          pMemBufPtr ;    /* temporary output */
  +    size_t          nMemBufSize ;   /* size of pMemBuf */
  +    size_t          nMemBufSizeFree;/* remaining space in pMemBuf */
  +
  +    int     nMarker ;               /*  Makers for rollback output */
  +
  +    FILEIO *  ofd  ;                /* output file descriptor */
  +
  +    SV *    ofdobj ;             /* perl object that is tied to stdout, if any */
  +    } tComponentOutput ;
  +
  +
   
   typedef struct tComponent
       {
  @@ -195,6 +221,7 @@
   
       tComponentConfig    Config ;    /**< request configuration data */
       tComponentParam     Param ;     /**< parameter passed to current request */
  +    tComponentOutput *  pOutput ;   /**< output channel for this component */
   
       bool    bReqRunning  ;   /* we are inside of a request */
       bool    bSubReq ;           /* This is a sub request (called inside an Embperl 
page) */
  @@ -245,35 +272,16 @@
       int                 bEscInUrl ;     /* we are inside an url */
       
   
  -    /* --- buffering output */
  -
  -    struct tBuf *   pFirstBuf  ;    /* First buffer */
  -    struct tBuf *   pLastBuf   ;    /* Last written buffer */
  -    struct tBuf *   pFreeBuf   ;    /* List of unused buffers */
  -    struct tBuf *   pLastFreeBuf ;  /* End of list of unused buffers */
  -
  -    char *          pMemBuf ;            /* temporary output */
  -    char *          pMemBufPtr ;    /* temporary output */
  -    size_t          nMemBufSize ;   /* size of pMemBuf */
  -    size_t          nMemBufSizeFree;/* remaining space in pMemBuf */
  -
  -    int     nMarker ;               /*  Makers for rollback output */
  -
       /* --- i/o filehandles --- */
   
       FILEIO *  ifd  ;      /* input file */
  -    FILEIO *  ofd  ;      /* output file */
  -
  -    SV *    ofdobj ; /* perl object that is tied to stdout, if any */
       SV *    ifdobj ; /* perl object that is tied to stdin, if any */
   
       bool    bAppendToMainReq ; /* append output to main request */
  -    bool    bDisableOutput ;   /* no output is generated */
   
       /* ------------------------ */
   
       struct tComponent *  pPrev ;  /* Component from which this one is called */
  -    struct tComponent *  pOrg  ;  /* Original Component from which it is copied 
into the tReq object */
   
       /* ------------------------ */
       
  
  
  
  1.1.2.17  +131 -15   embperl/Attic/epinit.c
  
  Index: epinit.c
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epinit.c,v
  retrieving revision 1.1.2.16
  retrieving revision 1.1.2.17
  diff -u -r1.1.2.16 -r1.1.2.17
  --- epinit.c  24 Jan 2002 08:37:05 -0000      1.1.2.16
  +++ epinit.c  25 Jan 2002 07:04:31 -0000      1.1.2.17
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epinit.c,v 1.1.2.16 2002/01/24 08:37:05 richter Exp $
  +#   $Id: epinit.c,v 1.1.2.17 2002/01/25 07:04:31 richter Exp $
   #
   
###################################################################################*/
   
  @@ -966,6 +966,45 @@
       }
       
   /*---------------------------------------------------------------------------
  +* embperl_CleanupOutput
  +*/
  +/*!
  +*
  +* \_en                                                                          
  +* cleanup data for component output object
  +* \endif                                                                       
  +*
  +* \_de                                                                          
  +* R�umt das Component-Ausgabe Objekt auf
  +* \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +int    embperl_CleanupOutput   (/*in*/ tReq *                r,
  +                                /*in*/ tComponent *           c)
  +                     
  +                     
  +    {
  +    epTHX_
  +    tComponentOutput * pOutput = c -> pOutput ;
  +
  +    if (c -> pPrev && c -> pPrev -> pOutput == pOutput)
  +        { /* this component uses the main output object */
  +        return ok ;
  +        }
  +
  +    CloseOutput (r, pOutput) ;
  +
  +    SvREFCNT_dec (pOutput -> _perlsv) ;
  +    ep_destroy_pool (pOutput -> pPool) ;
  +
  +    return ok ;
  +    }
  +
  +    
  +/*---------------------------------------------------------------------------
   * embperl_CleanupComponent
   */
   /*!
  @@ -989,10 +1028,26 @@
       {
       epTHX_
   
  +    embperl_CleanupOutput (r, c) ;
  +
       SvREFCNT_dec (c -> Config._perlsv) ;
       SvREFCNT_dec (c -> Param._perlsv) ;
       SvREFCNT_dec (c -> _perlsv) ;
   
  +    if (c == &r -> Component && c -> pPrev)
  +        { /* we have a previous component, so let restore it */
  +        tComponent * pPrev = c -> pPrev;
  +        SV * pHV ;
  +
  +        memcpy (c, pPrev, sizeof (*c)) ;
  +        
  +     /* adjust pointer in perl magic */
  +        pHV = SvRV (c -> _perlsv) ;
  +     sv_unmagic (pHV, '~') ;
  +     sv_magic (pHV, NULL, '~', (char *)&pPrev, sizeof (pPrev)) ;
  +        }
  +   
  +    
       return ok ;
       }
   
  @@ -1017,9 +1072,7 @@
       {
       epTHX_
       int i ;
  -    SV *   psv ;
       HE *   pEntry ;
  -    char * pKey ;
       I32    l ;
       
       sv_setsv(r -> pThread -> pReqRV, &sv_undef) ;   
  @@ -1113,7 +1166,63 @@
       }
   
   
  -    
  +/*---------------------------------------------------------------------------
  +* embperl_SetupOutput
  +*/
  +/*!
  +*
  +* \_en                                                                          
  +* setup data for component output object
  +* \endif                                                                       
  +*
  +* \_de                                                                          
  +* Initialisiert das Component-Ausgabe Objekt
  +* \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +int    embperl_SetupOutput     (/*in*/ tReq *                r,
  +                                /*in*/tComponent *           c)
  +                     
  +                     
  +    {
  +    epTHX_
  +    int          rc ;
  +    SV *         pSV ;
  +    SV *         pRV ;
  +    tComponentOutput * pOutput ;
  +    tMemPool * pPool  ;
  +
  +    if (!c -> Param.pOutput && !c -> Param.sOutputfile && c -> pPrev)
  +        { /* this component uses the main output object */
  +        c -> pOutput = c -> pPrev -> pOutput ;
  +        return ok ;
  +        }
  +
  +    pPool = ep_make_sub_pool (r -> pPool) ;
  +
  +    
epxs_Embperl__Req_create_obj(pOutput,pSV,pRV,ep_palloc(pPool,sizeof(tComponentOutput)))
 ;
  +    pOutput -> pPool         = pPool ;
  +    c -> pOutput = pOutput ;
  +
  +    if (r -> Component.pImportStash)
  +     pOutput -> bDisableOutput = 1 ;
  +    else if (c -> Param.pOutput)
  +        {
  +        if ((rc = OpenOutput (r, "")) != ok)
  +            return rc ;
  +        }
  +    else
  +        {
  +        if ((rc = OpenOutput (r, c -> Param.sOutputfile)) != ok)
  +            return rc ;
  +        }
  +
  +    return ok ;
  +    }
  +
   
   /*---------------------------------------------------------------------------
   * embperl_SetupComponent
  @@ -1147,18 +1256,25 @@
       tComponentConfig * pConfig ;
       epTHX ;
   
  -#if 0
  -    epxs_Embperl__Component_create_obj(c,pComponentSV, 
pComponentRV,ep_palloc(r->pPool,sizeof(*c))) ;
   
  +    if (r -> Component._perlsv)
  +        { /* we have already a component, so let safe it first */
  +        tComponent * pPrev ;
  +        SV * pHV ;
   
  -    /* for performance reason we copy the actual component directly into the 
request object */
  -    c -> pPrev      = r -> Component.pOrg ;
  -    if (c -> pPrev)
  -        memcpy (c -> pPrev, &r -> Component, sizeof (*c -> pPrev)) ;
  -    c -> pOrg = c ;
  -    memcpy (&r -> Component, c, sizeof (r -> Component)) ;
  -#endif
  -    
  +        pPrev = ep_palloc(r->pPool,sizeof(*pPrev)) ;
  +
  +        memcpy (pPrev, &r -> Component, sizeof (*pPrev)) ;
  +        
  +        r -> Component.pPrev = pPrev ;
  +
  +     /* adjust pointer in perl magic */
  +        pHV = SvRV (pPrev -> _perlsv) ;
  +     sv_unmagic (pHV, '~') ;
  +     sv_magic (pHV, NULL, '~', (char *)&pPrev, sizeof (pPrev)) ;
  +        }
  +
  +   
       epxs_Embperl__Component_create_obj(c,pComponentSV, pComponentRV,&r->Component) ;
       epxs_Embperl__Component__Param_create_obj(pParam,pSV, pRV,&r->Component.Param) ;
       epxs_Embperl__Component__Config_create_obj(pConfig,pSV, 
pRV,&r->Component.Config) ;
  @@ -1216,7 +1332,7 @@
   
       *ppComponent = c ;
   
  -    return ok ;
  +    return embperl_SetupOutput (r, c) ;
       }
   
   
  
  
  
  1.16.4.8  +111 -116  embperl/epio.c
  
  Index: epio.c
  ===================================================================
  RCS file: /home/cvs/embperl/epio.c,v
  retrieving revision 1.16.4.7
  retrieving revision 1.16.4.8
  diff -u -r1.16.4.7 -r1.16.4.8
  --- epio.c    19 Jan 2002 14:13:41 -0000      1.16.4.7
  +++ epio.c    25 Jan 2002 07:04:31 -0000      1.16.4.8
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epio.c,v 1.16.4.7 2002/01/19 14:13:41 richter Exp $
  +#   $Id: epio.c,v 1.16.4.8 2002/01/25 07:04:31 richter Exp $
   #
   
###################################################################################*/
   
  @@ -74,11 +74,11 @@
   struct tBuf *   oBegin (/*i/o*/ register req * r)
   
       {
  -    EPENTRY1N (oBegin, r -> Component.nMarker) ;
  +    EPENTRY1N (oBegin, r -> Component.pOutput -> nMarker) ;
       
  -    r -> Component.nMarker++ ;
  +    r -> Component.pOutput -> nMarker++ ;
       
  -    return r -> Component.pLastBuf ;
  +    return r -> Component.pOutput -> pLastBuf ;
       }
   
   /* 
-------------------------------------------------------------------------------------
  @@ -91,37 +91,37 @@
                        struct tBuf *   pBuf) 
   
       {
  -    EPENTRY1N (oRollback, r -> Component.nMarker) ;
  +    EPENTRY1N (oRollback, r -> Component.pOutput -> nMarker) ;
   
       if (pBuf == NULL)
           {
  -        if (r -> Component.pLastFreeBuf)
  -            r -> Component.pLastFreeBuf -> pNext = r -> Component.pFirstBuf ;
  +        if (r -> Component.pOutput -> pLastFreeBuf)
  +            r -> Component.pOutput -> pLastFreeBuf -> pNext = r -> 
Component.pOutput -> pFirstBuf ;
           else 
  -            r -> Component.pFreeBuf = r -> Component.pFirstBuf ;
  +            r -> Component.pOutput -> pFreeBuf = r -> Component.pOutput -> 
pFirstBuf ;
           
  -        r -> Component.pLastFreeBuf = r -> Component.pLastBuf ;
  +        r -> Component.pOutput -> pLastFreeBuf = r -> Component.pOutput -> pLastBuf 
;
           
  -        r -> Component.pFirstBuf   = NULL ;
  -        r -> Component.nMarker     = 0 ;
  +        r -> Component.pOutput -> pFirstBuf   = NULL ;
  +        r -> Component.pOutput -> nMarker     = 0 ;
           }
       else
        {
  -        if (r -> Component.pLastBuf == pBuf || pBuf -> pNext == NULL)
  -            r -> Component.nMarker-- ;
  +        if (r -> Component.pOutput -> pLastBuf == pBuf || pBuf -> pNext == NULL)
  +            r -> Component.pOutput -> nMarker-- ;
           else
               {
  -            r -> Component.nMarker = pBuf -> pNext -> nMarker - 1 ;
  -            if (r -> Component.pLastFreeBuf)
  -                r -> Component.pLastFreeBuf -> pNext = pBuf -> pNext ;
  +            r -> Component.pOutput -> nMarker = pBuf -> pNext -> nMarker - 1 ;
  +            if (r -> Component.pOutput -> pLastFreeBuf)
  +                r -> Component.pOutput -> pLastFreeBuf -> pNext = pBuf -> pNext ;
               else
  -                r -> Component.pFreeBuf = pBuf -> pNext ;
  -            r -> Component.pLastFreeBuf = r -> Component.pLastBuf ;
  +                r -> Component.pOutput -> pFreeBuf = pBuf -> pNext ;
  +            r -> Component.pOutput -> pLastFreeBuf = r -> Component.pOutput -> 
pLastBuf ;
               }
           pBuf -> pNext = NULL ;
           }
           
  -    r -> Component.pLastBuf = pBuf ;
  +    r -> Component.pOutput -> pLastBuf = pBuf ;
   
       }
   
  @@ -152,21 +152,21 @@
                      char *          pOut) 
   
       {
  -    EPENTRY1N (oCommit, r -> Component.nMarker) ;
  +    EPENTRY1N (oCommit, r -> Component.pOutput -> nMarker) ;
   
       
       if (pBuf == NULL)
  -        r -> Component.nMarker = 0 ;
  +        r -> Component.pOutput -> nMarker = 0 ;
       else
  -        if (r -> Component.pLastBuf == pBuf)
  -            r -> Component.nMarker-- ;
  +        if (r -> Component.pOutput -> pLastBuf == pBuf)
  +            r -> Component.pOutput -> nMarker-- ;
           else
  -            r -> Component.nMarker = pBuf -> pNext -> nMarker - 1 ;
  +            r -> Component.pOutput -> nMarker = pBuf -> pNext -> nMarker - 1 ;
       
  -    if (r -> Component.nMarker == 0)
  +    if (r -> Component.pOutput -> nMarker == 0)
           {
           if (pBuf == NULL)
  -            pBuf = r -> Component.pFirstBuf ;
  +            pBuf = r -> Component.pOutput -> pFirstBuf ;
           else
               pBuf = pBuf -> pNext ;
           
  @@ -203,7 +203,7 @@
                      struct tBuf *   pBuf) 
   
       {
  -    EPENTRY1N (oCommit, r -> Component.nMarker) ;
  +    EPENTRY1N (oCommit, r -> Component.pOutput -> nMarker) ;
   
       oCommitToMem (r, pBuf, NULL) ;
       }
  @@ -213,7 +213,7 @@
   /* write to a buffer                                                            */
   /*                                                                              */
   /* we will alloc a new buffer for every write                                   */
  -/* this is fast with apache palloc or for malloc if no free is call in between  */
  +/* this is fast with ep_palloc                                                  */
   /*                                                                              */
   /* ---------------------------------------------------------------------------- */
   
  @@ -225,9 +225,9 @@
       {
       struct tBuf * pBuf ;
   
  -    EPENTRY1N (bufwrite, r -> Component.nMarker) ;
  +    EPENTRY1N (bufwrite, r -> Component.pOutput -> nMarker) ;
   
  -    pBuf = (struct tBuf *)_malloc (r, size + sizeof (struct tBuf)) ;
  +    pBuf = (struct tBuf *)ep_palloc (r -> Component.pOutput -> pPool, size + sizeof 
(struct tBuf)) ;
   
       if (pBuf == NULL)
           return 0 ;
  @@ -235,25 +235,25 @@
       memcpy (pBuf + 1,  ptr, size) ;
       pBuf -> pNext   = NULL ;
       pBuf -> nSize   = size ;
  -    pBuf -> nMarker = r -> Component.nMarker ;
  +    pBuf -> nMarker = r -> Component.pOutput -> nMarker ;
   
  -    if (r -> Component.pLastBuf)
  +    if (r -> Component.pOutput -> pLastBuf)
           {
  -        r -> Component.pLastBuf -> pNext = pBuf ;
  -        pBuf -> nCount    = r -> Component.pLastBuf -> nCount + size ;
  +        r -> Component.pOutput -> pLastBuf -> pNext = pBuf ;
  +        pBuf -> nCount    = r -> Component.pOutput -> pLastBuf -> nCount + size ;
           }
       else
           pBuf -> nCount    = size ;
           
  -    if (r -> Component.pFirstBuf == NULL)
  -        r -> Component.pFirstBuf = pBuf ;
  -    r -> Component.pLastBuf = pBuf ;
  +    if (r -> Component.pOutput -> pFirstBuf == NULL)
  +        r -> Component.pOutput -> pFirstBuf = pBuf ;
  +    r -> Component.pOutput -> pLastBuf = pBuf ;
   
   
       return size ;
       }
   
  -
  +#if 0
   /* ---------------------------------------------------------------------------- */
   /*                                                                              */
   /* free buffers                                                                 */
  @@ -274,17 +274,17 @@
   #ifdef APACHE
       if ((r -> Component.Config.bDebug & dbgMem) == 0 && pAllocReq != NULL)
           {
  -        r -> Component.pFirstBuf    = NULL ;
  -        r -> Component.pLastBuf     = NULL ;
  -        r -> Component.pFreeBuf     = NULL ;
  -        r -> Component.pLastFreeBuf = NULL ;
  +        r -> Component.pOutput -> pFirstBuf    = NULL ;
  +        r -> Component.pOutput -> pLastBuf     = NULL ;
  +        r -> Component.pOutput -> pFreeBuf     = NULL ;
  +        r -> Component.pOutput -> pLastFreeBuf = NULL ;
           return ; /* no need for apache to free memory */
           }
   #endif
           
       /* first walk thru the used buffers */
   
  -    pBuf = r -> Component.pFirstBuf ;
  +    pBuf = r -> Component.pOutput -> pFirstBuf ;
       while (pBuf)
           {
           pNext = pBuf -> pNext ;
  @@ -292,13 +292,13 @@
           pBuf = pNext ;
           }
   
  -    r -> Component.pFirstBuf = NULL ;
  -    r -> Component.pLastBuf  = NULL ;
  +    r -> Component.pOutput -> pFirstBuf = NULL ;
  +    r -> Component.pOutput -> pLastBuf  = NULL ;
   
   
       /* now walk thru the unused buffers */
       
  -    pBuf = r -> Component.pFreeBuf ;
  +    pBuf = r -> Component.pOutput -> pFreeBuf ;
       while (pBuf)
           {
           pNext = pBuf -> pNext ;
  @@ -306,9 +306,10 @@
           pBuf = pNext ;
           }
   
  -    r -> Component.pFreeBuf = NULL ;
  -    r -> Component.pLastFreeBuf  = NULL ;
  +    r -> Component.pOutput -> pFreeBuf = NULL ;
  +    r -> Component.pOutput -> pLastFreeBuf  = NULL ;
       }
  +#endif
   
   /* ---------------------------------------------------------------------------- */
   /*                                                                              */
  @@ -318,8 +319,8 @@
   
   int GetContentLength (/*i/o*/ register req * r)
       {
  -    if (r -> Component.pLastBuf)
  -        return r -> Component.pLastBuf -> nCount ;
  +    if (r -> Component.pOutput -> pLastBuf)
  +        return r -> Component.pOutput -> pLastBuf -> nCount ;
       else
           return 0 ;
       
  @@ -650,20 +651,20 @@
       GV *handle ;
       epTHX ;
       
  -    r -> Component.pFirstBuf = NULL ; 
  -    r -> Component.pLastBuf  = NULL ; 
  -    r -> Component.nMarker   = 0 ;
  -    r -> Component.pMemBuf   = NULL ;
  -    r -> Component.nMemBufSize = 0 ;
  -    r -> Component.pFreeBuf     = NULL ;
  -    r -> Component.pLastFreeBuf = NULL ;
  +    r -> Component.pOutput -> pFirstBuf = NULL ; 
  +    r -> Component.pOutput -> pLastBuf  = NULL ; 
  +    r -> Component.pOutput -> nMarker   = 0 ;
  +    r -> Component.pOutput -> pMemBuf   = NULL ;
  +    r -> Component.pOutput -> nMemBufSize = 0 ;
  +    r -> Component.pOutput -> pFreeBuf     = NULL ;
  +    r -> Component.pOutput -> pLastFreeBuf = NULL ;
   
   
       
  -    if (r -> Component.ofd && r -> Component.ofd != PerlIO_stdoutF)
  -        PerlIO_close (r -> Component.ofd) ;
  +    if (r -> Component.pOutput -> ofd && r -> Component.pOutput -> ofd != 
PerlIO_stdoutF)
  +        PerlIO_close (r -> Component.pOutput -> ofd) ;
   
  -    r -> Component.ofd = NULL ;
  +    r -> Component.pOutput -> ofd = NULL ;
   
       if (sFilename == NULL || *sFilename == '\0')
           {
  @@ -679,7 +680,7 @@
        handle = gv_fetchpv("STDOUT", TRUE, SVt_PVIO) ;
        if (handle && SvMAGICAL(handle) && (mg = mg_find((SV*)handle, 'q')) && 
mg->mg_obj) 
            {
  -         r -> Component.ofdobj = mg->mg_obj ;
  +         r -> Component.pOutput -> ofdobj = mg->mg_obj ;
            if (r -> Component.Config.bDebug)
                {
                char *package = HvNAME(SvSTASH((SV*)SvRV(mg->mg_obj)));
  @@ -688,7 +689,7 @@
            return ok ;
            }
        
  -     r -> Component.ofd = PerlIO_stdoutF ;
  +     r -> Component.pOutput -> ofd = PerlIO_stdoutF ;
           
           if (r -> Component.Config.bDebug)
               {
  @@ -706,9 +707,9 @@
           lprintf (r -> pApp,  "[%d]Open %s for output...\n", r -> pThread -> nPid, 
sFilename) ;
   
   #ifdef WIN32
  -    if ((r -> Component.ofd = PerlIO_open (sFilename, "wb")) == NULL)
  +    if ((r -> Component.pOutput -> ofd = PerlIO_open (sFilename, "wb")) == NULL)
   #else
  -    if ((r -> Component.ofd = PerlIO_open (sFilename, "w")) == NULL)
  +    if ((r -> Component.pOutput -> ofd = PerlIO_open (sFilename, "w")) == NULL)
   #endif        
           {
           strncpy (r -> errdat1, sFilename, sizeof (r -> errdat1) - 1) ;
  @@ -727,40 +728,32 @@
   /* ---------------------------------------------------------------------------- */
   
   
  -int CloseOutput (/*i/o*/ register req * r)
  +int CloseOutput (/*in*/ tReq *             r,
  +                        tComponentOutput * pOutput)
   
       {
       epTHX ;
       
  -    /* make sure all buffers are freed */
  -
  -    buffree (r) ; 
  -
  -/* #if defined (APACHE)
  -    if (r -> pApacheReq)
  -        return ok ;
  -  #endif */
  -
   #if 0
  -    if (0) /* r -> Component.ofdobj) */
  +    if (0) /* r -> Component.pOutput -> ofdobj) */
        {           
        dSP;
        ENTER;
        SAVETMPS;
        PUSHMARK(sp);
  -     XPUSHs(r -> Component.ifdobj);
  +     XPUSHs(pOutput -> ofdobj);
        PUTBACK;
        perl_call_method ("CLOSE", G_VOID | G_EVAL) ; 
        FREETMPS;
        LEAVE;
  -     r -> Component.ofdobj = NULL ;
  +     pOutput -> ofdobj = NULL ;
        }
   #endif
   
  -    if (r -> Component.ofd && r -> Component.ofd != PerlIO_stdoutF)
  -        PerlIO_close (r -> Component.ofd) ;
  +    if (pOutput -> ofd && pOutput -> ofd != PerlIO_stdoutF)
  +        PerlIO_close (pOutput -> ofd) ;
   
  -    r -> Component.ofd = NULL ;
  +    pOutput -> ofd = NULL ;
   
       return ok ;
       }
  @@ -780,13 +773,13 @@
   
       {
       if (pBuf == NULL)
  -     pBuf = _malloc (r, nBufSize) ;
  +     pBuf = ep_palloc (r -> Component.pOutput -> pPool, nBufSize) ;
   
       *pBuf = '\0' ;
  -    r -> Component.pMemBuf    = pBuf ;
  -    r -> Component.pMemBufPtr      = pBuf ;
  -    r -> Component.nMemBufSize     = nBufSize ;
  -    r -> Component.nMemBufSizeFree = nBufSize ;
  +    r -> Component.pOutput -> pMemBuf         = pBuf ;
  +    r -> Component.pOutput -> pMemBufPtr      = pBuf ;
  +    r -> Component.pOutput -> nMemBufSize     = nBufSize ;
  +    r -> Component.pOutput -> nMemBufSizeFree = nBufSize ;
       }
   
   
  @@ -800,10 +793,10 @@
   char * OutputToStd (/*i/o*/ register req * r)
   
       {
  -    char * p = r -> Component.pMemBuf ;
  -    r -> Component.pMemBuf         = NULL ;
  -    r -> Component.nMemBufSize     = 0 ;
  -    r -> Component.nMemBufSizeFree = 0 ;
  +    char * p = r -> Component.pOutput -> pMemBuf ;
  +    r -> Component.pOutput -> pMemBuf         = NULL ;
  +    r -> Component.pOutput -> nMemBufSize     = 0 ;
  +    r -> Component.pOutput -> nMemBufSizeFree = 0 ;
       return p ;
       }
   
  @@ -836,51 +829,53 @@
       size_t n = size ;
       epTHX ;
   
  -    if (n == 0 || r -> Component.bDisableOutput)
  +    if (n == 0 || r -> Component.pOutput -> bDisableOutput)
           return 0 ;
   
  -    if (r -> Component.pMemBuf)
  +    if (r -> Component.pOutput -> pMemBuf)
           {
           char * p ;
  -        size_t s = r -> Component.nMemBufSize ;
  -        if (n >= r -> Component.nMemBufSizeFree)
  +        size_t s = r -> Component.pOutput -> nMemBufSize ;
  +        if (n >= r -> Component.pOutput -> nMemBufSizeFree)
               {
               size_t oldsize = s ;
               if (s < n)
  -                s = n + r -> Component.nMemBufSize ;
  +                s = n + r -> Component.pOutput -> nMemBufSize ;
               
  -            r -> Component.nMemBufSize      += s ;
  -            r -> Component.nMemBufSizeFree  += s ;
  +            r -> Component.pOutput -> nMemBufSize      += s ;
  +            r -> Component.pOutput -> nMemBufSizeFree  += s ;
               /*lprintf (r -> pApp,  "[%d]MEM:  Realloc pMemBuf, nMemSize = %d\n", 
nPid, nMemBufSize) ; */
  -            p = _realloc (r, r -> Component.pMemBuf, oldsize, r -> 
Component.nMemBufSize) ;
  +            
  +            p = ep_palloc (r -> Component.pOutput -> pPool, r -> Component.pOutput 
-> nMemBufSize) ;
               if (p == NULL)
                   {
  -                r -> Component.nMemBufSize      -= s ;
  -                r -> Component.nMemBufSizeFree  -= s ;
  +                r -> Component.pOutput -> nMemBufSize      -= s ;
  +                r -> Component.pOutput -> nMemBufSizeFree  -= s ;
                   return 0 ;
                   }
  -            r -> Component.pMemBufPtr = p + (r -> Component.pMemBufPtr - r -> 
Component.pMemBuf) ;
  -            r -> Component.pMemBuf = p ;
  +            memcpy (p, r -> Component.pOutput -> pMemBuf, oldsize) ;
  +            r -> Component.pOutput -> pMemBufPtr = p + (r -> Component.pOutput -> 
pMemBufPtr - r -> Component.pOutput -> pMemBuf) ;
  +            r -> Component.pOutput -> pMemBuf = p ;
               }
                   
  -        memcpy (r -> Component.pMemBufPtr, ptr, n) ;
  -        r -> Component.pMemBufPtr += n ;
  -        *(r -> Component.pMemBufPtr) = '\0' ;
  -        r -> Component.nMemBufSizeFree -= n ;
  +        memcpy (r -> Component.pOutput -> pMemBufPtr, ptr, n) ;
  +        r -> Component.pOutput -> pMemBufPtr += n ;
  +        *(r -> Component.pOutput -> pMemBufPtr) = '\0' ;
  +        r -> Component.pOutput -> nMemBufSizeFree -= n ;
           return n ;
           }
   
       
  -    if (r -> Component.nMarker)
  +    if (r -> Component.pOutput -> nMarker)
           return bufwrite (r, ptr, n) ;
   
  -    if (r -> Component.ofdobj)
  +    if (r -> Component.pOutput -> ofdobj)
        {           
        dSP;
        ENTER;
        SAVETMPS;
        PUSHMARK(sp);
  -     XPUSHs(r -> Component.ofdobj);
  +     XPUSHs(r -> Component.pOutput -> ofdobj);
        XPUSHs(sv_2mortal(newSVpv((char *)ptr,size)));
        PUTBACK;
        perl_call_method ("PRINT", G_SCALAR) ; 
  @@ -891,7 +886,7 @@
   
   
   #if defined (APACHE)
  -    if (r -> pApacheReq && r -> Component.ofd == NULL)
  +    if (r -> pApacheReq && r -> Component.pOutput -> ofd == NULL)
           {
           if (n > 0)
               {
  @@ -904,12 +899,12 @@
               return 0 ;
           }
   #endif
  -    if (n > 0)
  +    if (n > 0 && r -> Component.pOutput -> ofd)
           {
  -        n = PerlIO_write (r -> Component.ofd, (void *)ptr, size) ;
  +        n = PerlIO_write (r -> Component.pOutput -> ofd, (void *)ptr, size) ;
   
           if (r -> Component.Config.bDebug & dbgFlushOutput)
  -            PerlIO_flush (r -> Component.ofd) ;
  +            PerlIO_flush (r -> Component.pOutput -> ofd) ;
           }
   
       return n ;
  @@ -930,14 +925,14 @@
       {
       epTHX ;
       
  -    if (r -> Component.nMarker || r -> Component.pMemBuf || r -> Component.ofdobj)
  +    if (r -> Component.pOutput -> nMarker || r -> Component.pOutput -> pMemBuf || r 
-> Component.pOutput -> ofdobj)
           {
           owrite (r, &c, 1) ;
           return ;
           }
   
   #if defined (APACHE)
  -    if (r -> pApacheReq && r -> Component.ofd == NULL)
  +    if (r -> pApacheReq && r -> Component.pOutput -> ofd == NULL)
           {
           rputc (c, r -> pApacheReq) ;
           if (r -> Component.Config.bDebug & dbgFlushOutput)
  @@ -945,10 +940,10 @@
           return ;
           }
   #endif
  -    PerlIO_putc (r -> Component.ofd, c) ;
  +    PerlIO_putc (r -> Component.pOutput -> ofd, c) ;
   
       if (r -> Component.Config.bDebug & dbgFlushOutput)
  -        PerlIO_flush (r -> Component.ofd) ;
  +        PerlIO_flush (r -> Component.pOutput -> ofd) ;
       }
   
   
  
  
  
  1.75.4.90 +130 -948  embperl/epmain.c
  
  Index: epmain.c
  ===================================================================
  RCS file: /home/cvs/embperl/epmain.c,v
  retrieving revision 1.75.4.89
  retrieving revision 1.75.4.90
  diff -u -r1.75.4.89 -r1.75.4.90
  --- epmain.c  23 Jan 2002 15:09:00 -0000      1.75.4.89
  +++ epmain.c  25 Jan 2002 07:04:31 -0000      1.75.4.90
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epmain.c,v 1.75.4.89 2002/01/23 15:09:00 richter Exp $
  +#   $Id: epmain.c,v 1.75.4.90 2002/01/25 07:04:31 richter Exp $
   #
   
###################################################################################*/
   
  @@ -385,41 +385,6 @@
       }
   
   
  -/* ---------------------------------------------------------------------------- */
  -/*                                                                              */
  -/* clean up embperl module                                                      */
  -/*                                                                              */
  -/* ---------------------------------------------------------------------------- */
  -
  -int Term ()
  -
  -    {
  -#if 0
  -    dTHX ;
  -    req * r = CurrReq ;
  -
  -    EPENTRY (iembperl_term) ;
  -    
  -    if (!bInitDone)
  -        return ok ; 
  -
  -    CloseLog (r->pApp) ;
  -    CloseOutput (r) ;
  -#endif    
  -    return ok ;
  -    }
  -
  -
  -
  -int ResetHandler (/*in*/ SV * pApacheReqSV)
  -    {
  -#ifdef APACHE
  -    request_rec * pReq = (request_rec *)SvIV((SV*)SvRV(pApacheReqSV));
  -    pReq -> handler = NULL ;
  -#endif
  -
  -    return ok ;
  -    }
   
   
   /* ---------------------------------------------------------------------------- */
  @@ -467,428 +432,6 @@
           }
       }
   
  -#if 0
  -/* ---------------------------------------------------------------------------- */
  -/*                                                                              */
  -/* Setup Configuration specficy data                                            */
  -/*                                                                              */
  -/* ---------------------------------------------------------------------------- */
  -
  -
  -tConf * SetupConfData   (/*in*/ HV *   pReqInfo,
  -                         /*in*/ SV *   pOpcodeMask)
  -
  -    {
  -#ifdef EP2
  -    SV * *   ppSV ;
  -    SV *     pSV ;
  -    SV * *   ppCV ;
  -    int           rc ;
  -#endif
  -
  -    tConf *  pConf = malloc (sizeof (tConf)) ;
  -    
  -    tainted = 0 ;
  -
  -    if (!pConf)
  -        return NULL ;
  -
  -    pConf -> bDebug =            GetHashValueUInt (pReqInfo, "debug", pCurrReq -> 
pConf?pCurrReq -> pConf -> bDebug:CurrComponent -> Config.bDebug) ;            /* 
Debugging options */
  -    pConf -> bOptions =          GetHashValueUInt (pReqInfo, "options",  pCurrReq 
-> pConf?pCurrReq -> pConf -> bOptions:CurrComponent -> Config.bOptions) ;  /* Options 
*/
  -    pConf -> nEscMode =          GetHashValueInt (pReqInfo, "escmode",  pCurrReq -> 
pConf?pCurrReq -> pConf -> nEscMode:escStd) ;  /* EscMode */
  -    pConf -> sPackage =          sstrdup (GetHashValueStr (pReqInfo, "package", 
NULL)) ;         /* Packagename */
  -    pConf -> sLogFilename = sstrdup (GetHashValueStr (pReqInfo, "log",  NULL)) ;    
        /* name of logfile */
  -    pConf -> sVirtLogURI  = sstrdup (GetHashValueStr (pReqInfo, "virtlog",  
pCurrReq -> pConf?pCurrReq -> pConf -> sVirtLogURI:NULL)) ;        /* name of logfile 
*/
  -    pConf -> pOpcodeMask  = pOpcodeMask ;                                           
        /* Opcode mask (if any) */
  -    pConf -> sCookieName  = sstrdup (GetHashValueStr (pReqInfo, "cookie_name",  
sCookieNameDefault))  ;   /* Name to use for cookie */
  -    pConf -> sCookieExpires = sstrdup (GetHashValueStr (pReqInfo, "cookie_expires", 
 ""))  ; /* cookie expiration time */
  -    pConf -> sCookieDomain = sstrdup (GetHashValueStr (pReqInfo, "cookie_domain",  
"")) ; ; /* domain patter for which the cookie should be returned */
  -    pConf -> sCookiePath   = sstrdup (GetHashValueStr (pReqInfo, "cookie_path",  
"")) ; ;   /* path to which cookie should be returned */
  -    pConf -> cMultFieldSep = '\t' ;
  -    pConf -> pOpenBracket  = "[*" ;
  -    pConf -> pCloseBracket = "*]" ;
  -    pConf -> sPath         = sstrdup (GetHashValueStr (pReqInfo, "path",  pCurrReq 
-> pConf?pCurrReq -> pConf -> sPath:NULL)) ;        /* file search path */
  -    pConf -> sReqFilename  = sstrdup (GetHashValueStr (pReqInfo, "reqfilename",  
pCurrReq -> pConf?pCurrReq -> pConf -> sReqFilename:NULL)) ;        /* filename of 
original request */
  -    pConf -> pReqParameter = pReqInfo ;
  -    pConf -> nSessionMode  =     GetHashValueInt (pReqInfo, "session_mode",  
pCurrReq -> pConf?pCurrReq -> pConf -> nSessionMode:smodeStd) ;
  -
  -#ifdef EP2
  -    pConf -> sRecipe =           sstrdup (GetHashValueStr (pReqInfo, "recipe", 
"Embperl")) ;         /* Recipe name */
  -    pConf -> bEP1Compat          = GetHashValueInt (pReqInfo, "ep1compat",  
pCurrReq -> pConf?pCurrReq -> pConf -> bEP1Compat:pCurrReq -> bEP1Compat) ;  /* 
EP1Compat */
  -
  -    pConf -> sCacheKey           = sstrdup (GetHashValueStr (pReqInfo, "cache_key", 
 pCurrReq -> pConf?pCurrReq -> pConf -> sCacheKey:NULL)) ; ;
  -    pConf -> bCacheKeyOptions = GetHashValueInt (pReqInfo, "cache_key_options",  
pCurrReq -> pConf?pCurrReq -> pConf -> bCacheKeyOptions:ckoptDefault) ;  
  -
  -    ppCV                         =     hv_fetch(pReqInfo, "expires_func", sizeof 
("expires_func") - 1, 0) ;  
  -    if (ppCV && *ppCV && SvOK (*ppCV))
  -     {
  -     if ((rc = EvalConfig (pCurrReq, *ppCV, 0, NULL, &pConf -> pExpiresCV)) != ok)
  -         LogError (pCurrReq, rc) ;
  -     }
  -    else
  -     pConf -> pExpiresCV     =  pCurrReq -> pConf?pCurrReq -> pConf -> 
pExpiresCV:NULL ;
  -    
  -
  -    ppCV                         =     hv_fetch(pReqInfo, "cache_key_func", sizeof 
("cache_key_func") - 1, 0) ;  
  -    if (ppCV && *ppCV && SvOK (*ppCV))
  -     {
  -     if ((rc = EvalConfig (pCurrReq, *ppCV, 0, NULL, &pConf -> pCacheKeyCV)) != ok)
  -         LogError (pCurrReq, rc) ;
  -     }
  -    else
  -     pConf -> pCacheKeyCV     =  pCurrReq -> pConf?pCurrReq -> pConf -> 
pCacheKeyCV:NULL ;
  -    
  -    pConf -> nExpiresIn          = GetHashValueInt (pReqInfo, "expires_in",  
pCurrReq -> pConf?pCurrReq -> pConf -> nExpiresIn:0) ;  
  -#endif
  -
  -
  -    return pConf ;
  -    }
  -
  -/* ---------------------------------------------------------------------------- */
  -/*                                                                              */
  -/* Free Configuration specficy data                                             */
  -/*                                                                              */
  -/* ---------------------------------------------------------------------------- */
  -
  -
  -void FreeConfData       (/*in*/ tConf *   pConf)
  -
  -    {
  -    if (!pConf)
  -        return ;
  -
  -    if (pConf -> sPackage)
  -        free (pConf -> sPackage) ;
  -    
  -    if (pConf -> sLogFilename)
  -        free (pConf -> sLogFilename) ;
  -
  -    if (pConf -> sVirtLogURI)
  -        free (pConf -> sVirtLogURI) ;
  -
  -    if (pConf -> sCookieName)
  -     free (pConf -> sCookieName) ;
  -
  -    if (pConf -> sCookieExpires)
  -     free (pConf -> sCookieExpires) ;
  -
  -    if (pConf -> sCookieDomain)
  -     free (pConf -> sCookieDomain) ;
  -
  -    if (pConf -> sCookiePath)
  -     free (pConf -> sCookiePath) ;
  -
  -    if (pConf -> sPath)
  -     free (pConf -> sPath) ;
  -
  -    if (pConf -> sReqFilename)
  -     free (pConf -> sReqFilename) ;
  -
  -#ifdef EP2
  -    if (pConf -> sRecipe)
  -     free (pConf -> sRecipe) ;
  - 
  -    if (pConf -> sCacheKey)
  -     free (pConf -> sCacheKey) ;
  - 
  -    if (pConf -> pCacheKeyCV)
  -     SvREFCNT_dec (pConf -> pCacheKeyCV) ;
  -
  -    if (pConf -> pExpiresCV)
  -     SvREFCNT_dec (pConf -> pExpiresCV) ;
  -#endif
  -
  -    free (pConf) ;
  -    }
  -
  -/* ---------------------------------------------------------------------------- */
  -/*                                                                              */
  -/* Setup File specficy data                                                     */
  -/*                                                                              */
  -/* ---------------------------------------------------------------------------- */
  -
  -
  -tFile * SetupFileData   (/*i/o*/ register req * r,
  -                         /*in*/  char *  sSourcefile,
  -                         /*in*/  double  mtime,
  -                         /*in*/  long    nFilesize,
  -                         /*in*/  int     nFirstLine,
  -                         /*in*/  tConf * pConf)
  -
  -    {
  -    SV * *      ppSV ;
  -    tFile *     f ;
  -    char     txt [sizeof (sDefaultPackageName) + 50] ;
  -    char *   cache_key;
  -    int              cache_key_len;
  -    char olddir[PATH_MAX] = "" ;
  -    char *      pNew ;
  -
  -    EPENTRY (SetupFileData) ;
  -
  -    tainted = 0 ;
  -
  -    /* Have we seen this sourcefile/package already ? */
  -    cache_key_len = strlen( sSourcefile ) ;
  -    if ( pConf->sPackage )
  -     cache_key_len += strlen( pConf->sPackage );
  -    
  -    /* is it a relativ filename? -> append path */
  -    if (!(sSourcefile[0] == '/' || 
  -          sSourcefile[0] == '\\' || 
  -          (isalpha(sSourcefile[0]) && sSourcefile[1] == ':' && 
  -               (sSourcefile[2] == '\\' || sSourcefile[2] == '/')) ||
  -         (r -> Component.Param.pInput && SvROK(r -> Component.Param.pInput))))
  -        getcwd (olddir, sizeof (olddir) - 1) ;
  -
  -    if ( olddir[0] )
  -     cache_key_len += strlen( olddir );
  -        
  -    cache_key = _malloc( r, cache_key_len + 5 );
  -    cache_key_len += 2 ;
  -    strcpy( cache_key, "--" );
  -    strcat( cache_key, sSourcefile );
  -    if ( pConf->sPackage )
  -     strcat( cache_key, pConf->sPackage );
  -
  -    if ( olddir[0] )
  -     strcat( cache_key, olddir );
  -
  -
  -#ifdef EP2
  -    if ( pConf->bEP1Compat && !pConf->sPackage )
  -     {
  -     strcat( cache_key, "-1" ); /* make sure Embperl 1.x compatible files get 
another namespace */
  -     cache_key_len += 2 ;
  -     }
  -#endif
  -
  -    ppSV = hv_fetch(pCacheHash, cache_key, cache_key_len, 0);  
  -    
  -    if (ppSV && *ppSV)
  -        {
  -        f = (tFile *)SvIV((SV*)SvRV(*ppSV)) ;
  -        
  -        if (mtime == 0 || f -> mtime != mtime)
  -            {
  -            hv_clear (f -> pCacheHash) ;
  -
  -            if (r -> Component.Config.bDebug)
  -                lprintf (r -> pApp,  "[%d]MEM: Reload %s in %s\n", r -> pThread -> 
nPid,  sSourcefile, f -> sCurrPackage) ;
  -#ifdef EP2   
  -         UndefSub (r, f -> sMainSub, f -> sCurrPackage) ;
  -#endif
  -
  -            f -> mtime       = mtime ;        /* last modification time of file */
  -            f -> nFilesize   = nFilesize ;    /* size of File */
  -         f -> bKeep       = (r -> Component.Config.bOptions & optKeepSrcInMemory) 
!= 0 ;
  -         f -> nFirstLine  = nFirstLine ;
  -         if (f -> pExportHash)
  -             {
  -             SvREFCNT_dec (f -> pExportHash) ;
  -             f -> pExportHash = NULL ;
  -             }
  -         if (f -> pBufSV)
  -             {
  -             SvREFCNT_dec (f -> pBufSV) ;
  -             f -> pBufSV = NULL ;
  -             }
  -         }
  -        pNew = "Found" ;
  -        }
  -    else
  -        { /* create new file structure */
  -        if ((f = malloc (sizeof (*f))) == NULL)
  -         {
  -         _free(r,cache_key);
  -            return NULL ;
  -         }
  -
  -        f -> sSourcefile = sstrdup (sSourcefile) ; /* Name of sourcefile */
  -        f -> mtime       = mtime ;    /* last modification time of file */
  -        f -> nFilesize   = nFilesize ;        /* size of File */
  -     f -> pBufSV      = NULL ;
  -     f -> pNext2Free  = NULL ;
  -     f -> bKeep       = (r -> Component.Config.bOptions & optKeepSrcInMemory) != 0;
  -     f -> pExportHash = NULL ;
  -     f -> nFirstLine  = nFirstLine ;
  -
  -        f -> pCacheHash  = newHV () ;    /* Hash containing CVs to precompiled subs 
*/
  -
  -        if (pConf -> sPackage)
  -            f -> sCurrPackage = strdup (pConf -> sPackage) ; /* Package of file  */
  -        else
  -            {
  -            sprintf (txt, sDefaultPackageName, nPackNo ) ;
  -            f -> sCurrPackage = strdup (txt) ; /* Package of file  */
  -            }
  -        sprintf (txt, sDefaultSubName, nPackNo ) ;
  -        f -> sMainSub = strdup (txt) ; /* Package of file  */
  -        nPackNo++ ;
  -        f -> nCurrPackage = strlen (f -> sCurrPackage); /* Package of file (length) 
*/
  -
  -        hv_store(pCacheHash, cache_key, cache_key_len, newRV_noinc (newSViv 
((IV)f)), 0) ;  
  -    
  -        if (r -> Component.Config.bDebug)
  -            lprintf (r -> pApp,  "[%d]MEM: Load %s in %s\n", r -> pThread -> nPid,  
sSourcefile, f -> sCurrPackage) ;
  -        pNew = "New" ;
  -        }
  -    if (r -> Component.Config.bDebug)
  -        lprintf (r -> pApp,  "[%d]CACHE: %s File for '%s' (%x) in '%s' hash 
cache-key '%s'\n", r -> pThread -> nPid,  pNew, f -> sSourcefile, f, f -> 
sCurrPackage, cache_key) ;
  -    
  -    _free(r,cache_key);
  -
  -    return f ;
  -    }
  -
  -/* ---------------------------------------------------------------------------- */
  -/*                                                                              */
  -/* Get file data from filename; preset if not present                           */
  -/*                                                                              */
  -/* ---------------------------------------------------------------------------- */
  -
  -
  -tFile * GetFileData     (/*in*/  char *  sSourcefile,
  -                         /*in*/  char *  sPackage,
  -                      /*in*/  double  mtime,
  -                      /*in*/  int     bEP1Compat)
  -                        
  -    {
  -    SV * *      ppSV ;
  -    tFile *     f ;
  -    char     txt [sizeof (sDefaultPackageName) + 50] ;
  -    char *   cache_key;
  -    int              cache_key_len;
  -    char olddir[PATH_MAX] = "" ;
  -    char *      pNew ;
  -    
  -    EPENTRY (GetFileData) ;
  -
  -    /* Have we seen this sourcefile/package already ? */
  -    cache_key_len = strlen( sSourcefile ) ;
  -    if ( sPackage && *sPackage)
  -     cache_key_len += strlen( sPackage );
  -    
  -    /* is it a relativ filename? -> append path */
  -    if (!(sSourcefile[0] == '/' || 
  -        sSourcefile[0] == '\\' || 
  -        (isalpha(sSourcefile[0]) && sSourcefile[1] == ':' && 
  -            (sSourcefile[2] == '\\' || sSourcefile[2] == '/'))))
  -        getcwd (olddir, sizeof (olddir) - 1) ;
  -
  -    if ( olddir[0] )
  -     cache_key_len += strlen( olddir );
  -        
  -    cache_key = malloc(cache_key_len + 5 );
  -    cache_key_len += 2 ;
  -    strcpy( cache_key, "--" );
  -    strcat( cache_key, sSourcefile );
  -    if ( sPackage && *sPackage)
  -     strcat( cache_key, sPackage );
  -
  -    if ( olddir[0] )
  -     strcat( cache_key, olddir );
  -
  -
  -#ifdef EP2
  -    if ( bEP1Compat )
  -     {
  -     strcat( cache_key, "-1" ); /* make sure Embperl 1.x compatible files get 
another namespace */
  -     cache_key_len += 2 ;
  -     }
  -#endif
  -
  -    ppSV = hv_fetch(pCacheHash, cache_key, cache_key_len, 0);  
  -    
  -    if (ppSV && *ppSV)
  -        {
  -        f = (tFile *)SvIV((SV*)SvRV(*ppSV)) ;
  -        
  -        if (mtime == 0 || f -> mtime != mtime)
  -            {
  -            hv_clear (f -> pCacheHash) ;
  -#ifdef EP2   
  -         UndefSub (pCurrReq, f -> sMainSub, f -> sCurrPackage) ;
  -#endif
  -        
  -            f -> mtime       = -1 ;   /* reset last modification time of file */
  -         if (f -> pExportHash)
  -             {
  -             SvREFCNT_dec (f -> pExportHash) ;
  -             f -> pExportHash = NULL ;
  -             }
  -         }
  -        pNew = "Found " ;
  -        }
  -    else
  -        { /* create new file structure */
  -        if ((f = malloc (sizeof (*f))) == NULL)
  -         {
  -         free(cache_key);
  -            return NULL ;
  -         }
  -
  -        f -> sSourcefile = sstrdup (sSourcefile) ; /* Name of sourcefile */
  -        f -> mtime       = -1 ;       /* last modification time of file */
  -        f -> nFilesize   = 0 ;        /* size of File */
  -     f -> pBufSV      = NULL ;
  -     f -> pNext2Free  = NULL ;
  -     f -> bKeep       = 0 ;
  -     f -> pExportHash = NULL ;
  -     f -> nFirstLine  = 0 ;
  -
  -        f -> pCacheHash  = newHV () ;    /* Hash containing CVs to precompiled subs 
*/
  -
  -     if ( sPackage && *sPackage)
  -            f -> sCurrPackage = strdup (sPackage) ; /* Package of file  */
  -        else
  -            {
  -            sprintf (txt, sDefaultPackageName, nPackNo ) ;
  -            f -> sCurrPackage = strdup (txt) ; /* Package of file  */
  -            }
  -        sprintf (txt, sDefaultSubName, nPackNo ) ;
  -        f -> sMainSub = strdup (txt) ; /* Package of file  */
  -        nPackNo++ ;
  -        f -> nCurrPackage = strlen (f -> sCurrPackage); /* Package of file (length) 
*/
  -
  -        hv_store(pCacheHash, cache_key, cache_key_len, newRV_noinc (newSViv 
((IV)f)), 0) ;  
  -    
  -        pNew = "New " ;
  -        }
  -
  -    if (CurrComponent -> Config.bDebug)
  -        lprintf (pCurrReq, "[%d]CACHE: %s File for %s (%x) in %s hash cache-key 
%s\n", pCurrReq -> nPid,  pNew, f -> sSourcefile, f, f -> sCurrPackage, cache_key) ;
  -    
  -    free(cache_key);
  -
  -    return f ;
  -    }
  -
  -/* ---------------------------------------------------------------------------- */
  -/*                                                                              */
  -/* Free File buffer                                                          */
  -/*                                                                              */
  -/* ---------------------------------------------------------------------------- */
  -
  -
  -static void FreeFileBuf     (/*i/o*/ register req * r,
  -                          /*i/o*/ tFile * f)
  -
  -
  -    {
  -    if (!f -> bKeep && f -> pBufSV)
  -     {
  -     SvREFCNT_dec (f -> pBufSV) ;
  -     f -> pBufSV = NULL ;
  -        if (r -> Component.Config.bDebug)
  -            lprintf (r -> pApp,  "[%d]MEM: Free buffer for %s in %s\n", r -> 
pThread -> nPid,  f -> sSourcefile, f -> sCurrPackage) ;
  -     }
  -    else if (r -> Component.Config.bDebug && !f -> pBufSV)
  -        lprintf (r -> pApp,  "[%d]MEM: Warning! buffer for %s in %s is NULL\n", r 
-> pThread -> nPid,  f -> sSourcefile, f -> sCurrPackage) ;
  -    }
  -
  -#endif
   
   /* ---------------------------------------------------------------------------- */
   /*                                                                              */
  @@ -984,164 +527,109 @@
       }
       
   
  -#if 0
  -
  +                     
   /* ---------------------------------------------------------------------------- */
   /*                                                                              */
  -/* Free Request                                                                 */
  +/* Setup Safe Namespace                                                         */
   /*                                                                              */
   /* ---------------------------------------------------------------------------- */
   
   
  -void FreeRequest (/*i/o*/ register req * r)
  +static void SetupSafeNamespace (/*i/o*/ register req * r)
   
  -    {
  -    FreeConfData (r -> pConf) ;
  -    r -> pConf = NULL ;
  +    {                 
  +    GV *    gv;
   
  -    if (!r -> Component.bAppendToMainReq && r -> Component.ofd)
  -        CloseOutput (r) ; /* just to be sure */
  -    
  -    if (r -> pApplication)
  -     SvREFCNT_dec (r -> pApplication) ;
  +    dTHR ;
  +    epTHX ;
   
  -    lprintf (r -> pApp,  "****free fh setup = %d  sub req = %d imp = %d\n", r -> 
bIsFormHashSetup, r -> Component.pPrev, r -> Component.pImportStash) ;
  +     /* The following is borrowed from Opcode.xs */
   
  -    if (r -> Component.pPrev)
  -        {
  -        tReq * l = r -> pLastReq ;
  +    if (r -> Component.Config.bOptions & optOpcodeMask)
  +        opmask_addlocal(aTHX_ r -> Component.Config.pOpcodeMask, r -> 
Component.op_mask_buf);
   
  -        l -> bError      = r -> bError ;
  -        l -> nLastErrFill= r -> nLastErrFill ;
  -        l -> bLastErrState= r -> bLastErrState ;
  -        }
  -    else
  +        
  +    if (r -> Component.Config.bOptions & optSafeNamespace)
           {
  -        tFile * pFile ;
  -        tFile * pNext ;
  -     int     i ;
  -
  -#ifdef HASHTEST
  -     pHash = perl_get_hv (sFormHashName, FALSE) ;
  -     if (pHash != r -> pThread -> pFormHash)
  -         {
  -         strcpy (r -> errdat1, sFormHashName) ;
  -         strcpy (r -> errdat2, " !!C-Adress differs from Perl-Adress!! in 
FreeRequest") ;
  -         LogError (r, rcHashError) ;
  -         }
  -#endif
  -
  -        hv_clear (r -> pThread -> pHeaderHash) ;
  -        hv_clear (r -> pThread -> pInputHash) ;
  -        if (!r -> Component.pImportStash)
  -            {                
  -         tReq * l = r -> pLastReq ;
  -            av_clear (r -> pThread -> pFormArray) ;
  -            hv_clear (r -> pThread -> pFormHash) ;
  -            hv_clear (r -> pThread -> pFormSplitHash) ;
  -            if (l)
  -             l -> bIsFormHashSetup = 0 ;
  -            }
  -#ifdef EP2 
  -        av_clear (r -> pDomTreeAV) ;
  -     for (i = 0 ; i < AvFILL (r -> pCleanupAV); i++)
  -         {
  -         sv_setsv (SvRV(*av_fetch (r -> pCleanupAV, i, 0)), &sv_undef) ;
  -         }
  -        av_clear (r -> pCleanupAV) ;
  -
  -        Cache_CleanupRequest (r) ;
  -
  -#endif
  -     if ((pFile = r -> pFiles2Free))
  -         {
  -         do
  -             {
  -             FreeFileBuf (r, pFile) ;
  -             pNext = pFile -> pNext2Free ;
  -             pFile -> pNext2Free = NULL ;
  -             }
  -         while (pFile != pNext && (pFile = pNext)) ;
  -         }
  -#ifdef APACHE
  -     r -> pApacheReq   = NULL ;
  -     r -> pApacheReqSV = &sv_undef ;
  -#endif
  -     }
  -
  -    if (r -> sSessionID)
  -     _free (r, r -> sSessionID) ;
  -
  -    SvREFCNT_dec (r -> _perlsv) ;
  +        save_aptr(&endav);
  +        endav = (AV*)sv_2mortal((SV*)newAV()); /* ignore END blocks for now  */
   
  -    pCurrReq = r -> pLastReq ;
  -    if (pCurrReq && pCurrReq -> _perlsv)
  -     {
  -     SV * pReqHV = SvRV (pCurrReq -> _perlsv) ;
  -     sv_unmagic (pReqHV, '~') ;
  -     sv_magic (pReqHV, NULL, '~', (char *)&pCurrReq, sizeof (pCurrReq)) ;
  -     }
  +        save_hptr(&defstash);                /* save current default stack   */
  +        /* the assignment to global defstash changes our sense of 'main'     */
  +        defstash = gv_stashpv(r -> Component.sCurrPackage, GV_ADDWARN); /* should 
exist already      */
   
  -#if defined (_DEBUG) && defined (WIN32)
  -    _CrtMemDumpAllObjectsSince(&r -> MemCheckpoint);    
  -#endif    
  -#ifdef DMALLOC
  -                         /* unsigned long mark, int not_freed_b, int freed_b, int 
details_b */
  -    dmalloc_log_changed (r -> MemCheckpoint, 1, 0, 1) ;
  -    dmalloc_message ( "[%d]%sRequest freed. Entry-SVs: %d -OBJs: %d Exit-SVs: %d 
-OBJs: %d\n", r -> pThread -> nPid,
  -         (r -> Component.pPrev?"Sub-":""), r -> stsv_count, r -> stsv_objcount, 
sv_count, sv_objcount) ;
  -#endif    
  -    if (r -> Component.Config.bDebug)
  -     DomStats (r -> pApp) ;
  +        if (r -> Component.Config.bDebug)
  +            lprintf (r -> pApp,  "[%d]REQ:  switch to safe namespace %s\n", r -> 
pThread -> nPid, r -> Component.sCurrPackage) ;
   
  -    r -> pNext = pReqFree ;
  -    pReqFree = r ;
   
  +        /* defstash must itself contain a main:: so we'll add that now       */
  +        /* take care with the ref counts (was cause of long standing bug)    */
  +        /* XXX I'm still not sure if this is right, GV_ADDWARN should warn!  */
  +        gv = gv_fetchpv("main::", GV_ADDWARN, SVt_PVHV);
  +        sv_free((SV*)GvHV(gv));
  +        GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
  +        }
       }
   
  -#endif
  -                     
   /* ---------------------------------------------------------------------------- */
   /*                                                                              */
  -/* Setup Safe Namespace                                                         */
  +/* Reset Request                                                                */
   /*                                                                              */
   /* ---------------------------------------------------------------------------- */
   
   
  -static void SetupSafeNamespace (/*i/o*/ register req * r)
  +static int ResetRequest (/*i/o*/ register req * r,
  +                     /*in*/ char *  sInputfile)
   
  -    {                 
  -    GV *    gv;
  +    {
  +    epTHX ;    
   
  -    dTHR ;
  -    epTHX ;
  +    if (r -> Component.Config.bDebug)
  +        {
  +        clock_t cl = clock () ;
  +        time_t t ;
  +        struct tm * tm ;
  +        
  +        time (&t) ;        
  +        tm =localtime (&t) ;
  +        
  +        lprintf (r -> pApp,  "[%d]PERF: input = %s\n", r -> pThread -> nPid, 
sInputfile) ;
  +#ifdef CLOCKS_PER_SEC
  +        lprintf (r -> pApp,  "[%d]PERF: Time: %d ms ", r -> pThread -> nPid, ((cl - 
r -> startclock) * 1000 / CLOCKS_PER_SEC)) ;
  +#else
  +        lprintf (r -> pApp,  "[%d]PERF: ", r -> pThread -> nPid) ;
  +#endif        
  +        lprintf (r -> pApp,  "\n") ;    
  +        lprintf (r -> pApp,  "[%d]%sRequest finished. %s. Entry-SVs: %d  Exit-SVs: 
%d \n", r -> pThread -> nPid,
  +         (r -> Component.pPrev?"Sub-":""), asctime(tm), r -> stsv_count, sv_count) ;
  +#ifdef DMALLOC
  +        dmalloc_message ( "[%d]%sRequest finished. Entry-SVs: %d Exit-SVs: %d \n", 
r -> pThread -> nPid,
  +         (r -> Component.pPrev?"Sub-":""), r -> stsv_count, sv_count) ;
  +#endif        
  +        }
   
  -     /* The following is borrowed from Opcode.xs */
  +    
  +    r -> Component.pCurrPos = NULL ;
   
  -    if (r -> Component.Config.bOptions & optOpcodeMask)
  -        opmask_addlocal(aTHX_ r -> Component.Config.pOpcodeMask, r -> 
Component.op_mask_buf);
   
  -        
  -    if (r -> Component.Config.bOptions & optSafeNamespace)
  -        {
  -        save_aptr(&endav);
  -        endav = (AV*)sv_2mortal((SV*)newAV()); /* ignore END blocks for now  */
  +    FlushLog (r -> pApp) ;
   
  -        save_hptr(&defstash);                /* save current default stack   */
  -        /* the assignment to global defstash changes our sense of 'main'     */
  -        defstash = gv_stashpv(r -> Component.sCurrPackage, GV_ADDWARN); /* should 
exist already      */
  +    r -> Component.nSourceline = 1 ;
  +    r -> Component.pSourcelinePos = NULL ;    
  +    r -> Component.pLineNoCurrPos = NULL ;    
   
  -        if (r -> Component.Config.bDebug)
  -            lprintf (r -> pApp,  "[%d]REQ:  switch to safe namespace %s\n", r -> 
pThread -> nPid, r -> Component.sCurrPackage) ;
  +    r -> Component.bReqRunning = 0 ;
   
  +    /*
  +    av_clear (r -> pErrFill) ;
  +    av_clear (r -> pErrState) ;
  +    */
   
  -        /* defstash must itself contain a main:: so we'll add that now       */
  -        /* take care with the ref counts (was cause of long standing bug)    */
  -        /* XXX I'm still not sure if this is right, GV_ADDWARN should warn!  */
  -        gv = gv_fetchpv("main::", GV_ADDWARN, SVt_PVHV);
  -        sv_free((SV*)GvHV(gv));
  -        GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
  -        }
  +#ifdef APACHE
  +    /* This must be the very very very last !!!!! */
  +    r -> pApacheReq = NULL ;
  +#endif
  +    return ok ;
       }
   
       
  @@ -1155,31 +643,8 @@
   static int StartOutput (/*i/o*/ register req * r)
   
       {
  -    int rc ;
  -    SV * pOutData  = r -> Component.Param.pOutput ;
  -    int  bOutToMem = pOutData && SvROK (pOutData) ;
  -    epTHX ;    
  -
  -    if (r -> Component.pImportStash)
  -     { /* import does not generate any output */
  -     r -> Component.bDisableOutput = 1 ;
  -     }
  -    else if (!bOutToMem)
  -        {
  -        if (!r -> Component.bAppendToMainReq)
  -            {
  -            if ((rc = OpenOutput (r, r -> Component.Param.sOutputfile)) != ok)
  -                return rc ;
  -            }
  -        else
  -            OutputToStd (r) ;
  -        }
  -    else
  -        { /* only reset output buffers */
  -        r -> Component.ofd = NULL ;
  -        OpenOutput (r, NULL) ;
  -        }
  -
  +    int  bOutToMem = r -> Component.Param.pOutput && SvROK (r -> 
Component.Param.pOutput) ;
  +    epTHX_
   
   #ifdef APACHE
       if (r -> pApacheReq && r -> pApacheReq -> main)
  @@ -1469,7 +934,7 @@
                if (r -> nIOType == epIOCGI)
                    {            
                    char txt[100] ;
  -                 int  save = r -> Component.nMarker ;
  +                 int  save = r -> Component.pOutput -> nMarker ;
                    SV *   pHeader ;
                    char * p ;
                    HE *   pEntry ;
  @@ -1477,7 +942,7 @@
                    I32    l ;
                    char * pContentType = "text/html";
   
  -                 r -> Component.nMarker = 0 ; /* output directly */
  +                 r -> Component.pOutput -> nMarker = 0 ; /* output directly */
           
                    hv_iterinit (r -> pThread -> pHeaderHash) ;
                    while ((pEntry = hv_iternext (r -> pThread -> pHeaderHash)))
  @@ -1547,7 +1012,7 @@
   
                    oputs (r, "\n") ;
   
  -                 r -> Component.nMarker = save ;
  +                 r -> Component.pOutput -> nMarker = save ;
                    }
                }
            }
  @@ -1665,16 +1130,6 @@
   
   
   #ifdef EP2
  -             if (r -> Component.Config.bEP1Compat)
  -                 {
  -#endif
  -                 lc -> pFirstBuf    = r -> Component.pFirstBuf  ;  
  -                 lc -> pLastBuf     = r -> Component.pLastBuf   ;  
  -                 lc -> pFreeBuf     = r -> Component.pFreeBuf   ;  
  -                 lc -> pLastFreeBuf = r -> Component.pLastFreeBuf ;
  -#ifdef EP2
  -                 }
  -             else
                    {
                    if (!bError && !r -> Component.pImportStash)
                        {
  @@ -1755,72 +1210,10 @@
   #endif
           }    
   
  -    if (!r -> Component.bAppendToMainReq)
  -        CloseOutput (r) ;
   
       return ok ;
       }
       
  -/* ---------------------------------------------------------------------------- */
  -/*                                                                              */
  -/* Reset Request                                                                */
  -/*                                                                              */
  -/* ---------------------------------------------------------------------------- */
  -
  -
  -static int ResetRequest (/*i/o*/ register req * r,
  -                     /*in*/ char *  sInputfile)
  -
  -    {
  -    epTHX ;    
  -
  -    if (r -> Component.Config.bDebug)
  -        {
  -        clock_t cl = clock () ;
  -        time_t t ;
  -        struct tm * tm ;
  -        
  -        time (&t) ;        
  -        tm =localtime (&t) ;
  -        
  -        lprintf (r -> pApp,  "[%d]PERF: input = %s\n", r -> pThread -> nPid, 
sInputfile) ;
  -#ifdef CLOCKS_PER_SEC
  -        lprintf (r -> pApp,  "[%d]PERF: Time: %d ms ", r -> pThread -> nPid, ((cl - 
r -> startclock) * 1000 / CLOCKS_PER_SEC)) ;
  -#else
  -        lprintf (r -> pApp,  "[%d]PERF: ", r -> pThread -> nPid) ;
  -#endif        
  -        lprintf (r -> pApp,  "\n") ;    
  -        lprintf (r -> pApp,  "[%d]%sRequest finished. %s. Entry-SVs: %d  Exit-SVs: 
%d \n", r -> pThread -> nPid,
  -         (r -> Component.pPrev?"Sub-":""), asctime(tm), r -> stsv_count, sv_count) ;
  -#ifdef DMALLOC
  -        dmalloc_message ( "[%d]%sRequest finished. Entry-SVs: %d Exit-SVs: %d \n", 
r -> pThread -> nPid,
  -         (r -> Component.pPrev?"Sub-":""), r -> stsv_count, sv_count) ;
  -#endif        
  -        }
  -
  -    
  -    r -> Component.pCurrPos = NULL ;
  -
  -
  -    FlushLog (r -> pApp) ;
  -
  -    r -> Component.nSourceline = 1 ;
  -    r -> Component.pSourcelinePos = NULL ;    
  -    r -> Component.pLineNoCurrPos = NULL ;    
  -
  -    r -> Component.bReqRunning = 0 ;
  -
  -    /*
  -    av_clear (r -> pErrFill) ;
  -    av_clear (r -> pErrState) ;
  -    */
  -
  -#ifdef APACHE
  -    /* This must be the very very very last !!!!! */
  -    r -> pApacheReq = NULL ;
  -#endif
  -    return ok ;
  -    }
   
   
   /* ---------------------------------------------------------------------------- */
  @@ -1873,7 +1266,15 @@
        XPUSHs(&sv_undef) ;  /*sv_2mortal(newRV_inc((SV *)pRP))); */
        XPUSHs(pRecipe);                
        PUTBACK;                        
  -     num = perl_call_pv ("Embperl::Recipe::GetRecipe", G_SCALAR /*| G_EVAL*/) ;
  +     num = perl_call_pv ("Embperl::Recipe::GetRecipe", G_SCALAR | G_EVAL) ;
  +        if (SvTRUE (ERRSV))
  +         {
  +            STRLEN l ;
  +            strncpy (r -> errdat1, SvPV (ERRSV, l), sizeof (r -> errdat1) - 1) ;
  +         LogError (r, rcEvalErr) ; 
  +         sv_setpv(ERRSV,"");
  +            num = 0 ;
  +            }
        tainted = 0 ;
        SPAGAIN;                        
        if (num == 1)
  @@ -1918,270 +1319,6 @@
       }
   
   
  -#if 0
  -
  -/* ---------------------------------------------------------------------------- */
  -/*                                                                              */
  -/* Process a block of the file                                               */
  -/*                                                                              */
  -/* ---------------------------------------------------------------------------- */
  -
  -    
  -
  -int ProcessBlock     (/*i/o*/ register req * r,
  -                      /*in*/  int     nBlockStart,
  -                      /*in*/  int     nBlockSize,
  -                         /*in*/  int     nBlockNo)
  -
  -    {
  -    int     rc ;
  -    char *  p ;
  -    int     n ;
  -
  -
  -    r -> Component.pCurrPos = r -> Component.pBuf + nBlockStart ;
  -    r -> Component.pEndPos  = r -> Component.pCurrPos + nBlockSize ;
  -    r -> Buf.nBlockNo = nBlockNo ;
  -
  -
  -    if (r -> Component.pTokenTable && strcmp ((char *)r -> Component.pTokenTable, 
"Text") == 0)
  -     { /* --- emulate Embperl 2  syntax => 'Text' --- */         
  -     owrite (r, r -> Component.pCurrPos, r -> Component.pEndPos - r -> 
Component.pCurrPos) ;
  -     return r -> Buf.nBlockNo ;
  -     }
  -
  -    rc = ok ;
  -    p = r -> Component.pCurrPos ;
  -    while (p && *p && p < r -> Component.pEndPos && rc == ok)
  -        {
  -        if ((r -> Component.Config.bDebug & dbgMem) && (sv_count != r -> 
lstsv_count || sv_objcount != r -> lstsv_objcount))
  -            {
  -            lprintf (r -> pApp,  "[%d]SVs:  Entry-SVs: %d -OBJs: %d Curr-SVs: %d 
-OBJs: %d\n", r -> pThread -> nPid, r -> stsv_count, r -> stsv_objcount, sv_count, 
sv_objcount) ;
  -            r -> lstsv_count = sv_count ;
  -            r -> lstsv_objcount = sv_objcount ;
  -            }
  -        
  -        /* */
  -        /* execute [x ... x] and special html tags and replace them if nessecary */
  -        /* */
  -
  -        if (r -> CmdStack.State.bProcessCmds == cmdAll && !(r -> 
Component.Config.bOptions & optDisableHtmlScan))
  -            {
  -            n = strcspn (p, "[<") ;
  -            p += n ;
  -            }
  -        else
  -            p = strchr (p, '[') ;
  -            
  -            
  -        if (p == NULL)
  -            { /* output the rest of html */
  -            owrite (r, r -> Component.pCurrPos, r -> Component.pEndPos - r -> 
Component.pCurrPos) ;
  -            break ;
  -            }
  -        
  -        if (r -> CmdStack.State.bProcessCmds == cmdAll)
  -            /* output until next cmd */
  -            owrite (r, r -> Component.pCurrPos, p - r -> Component.pCurrPos) ;
  -        
  -        if (*p == '\0')
  -            break ;
  -
  -        if (r -> Component.Config.bDebug & dbgSource)
  -            {
  -            char * s = p ;
  -            char * n ;
  -
  -            while (*s && isspace (*s))
  -                s++ ;
  -            
  -            if (*s)
  -                {
  -                GetLineNo (r) ;    
  -                n = strchr (s, '\n') ;
  -    
  -#ifdef CLOCKS_PER_SEC
  -                if (r -> Component.Config.bDebug & dbgProfile)
  -                    if (n)
  -                        lprintf (r -> pApp,  "[%d]SRC: Line %d: Time %d ms  
%*.*s\n", r -> pThread -> nPid, r -> Component.nSourceline, ((clock () - r -> 
startclock) * 1000 / CLOCKS_PER_SEC), n-s, n-s, s) ;
  -                    else
  -                        lprintf (r -> pApp,  "[%d]SRC: Line %d: Time %d ms  
%60.60s\n", r -> pThread -> nPid, r -> Component.nSourceline, ((clock () - r -> 
startclock) * 1000 / CLOCKS_PER_SEC), s) ;
  -                else
  -#endif
  -                    if (n)
  -                        lprintf (r -> pApp,  "[%d]SRC: Line %d: %*.*s\n", r -> 
pThread -> nPid, r -> Component.nSourceline, n-s, n-s, s) ;
  -                    else
  -                        lprintf (r -> pApp,  "[%d]SRC: Line %d: %60.60s\n", r -> 
pThread -> nPid, r -> Component.nSourceline, s) ;
  -
  -                }
  -            }        
  -
  -        
  -        r -> Buf.pCurrStart = p ;
  -        if (*p == '<')
  -            { /* HTML Tag */
  -            rc = ScanHtmlTag (r, p) ;
  -            }
  -         else
  -            { /* [x ... x] sequenz */
  -            if (p[1] == '*')
  -                break ;
  -            
  -            rc = ScanCmdEvals (r, p) ;
  -            }
  -        p = r -> Component.pCurrPos ;
  -        }
  -
  -    if (rc != ok)
  -        {
  -        if (rc != rcExit)
  -            LogError (r, rc) ;
  -        return 0 ;
  -        }
  -    
  -    return r -> Buf.nBlockNo ;
  -    }
  -
  -
  -         
  -         
  -         
  -/* ---------------------------------------------------------------------------- */
  -/*                                                                              */
  -/* Read input file into memory                                               */
  -/*                                                                              */
  -/* ---------------------------------------------------------------------------- */
  -
  -int ReadInputFile    (/*i/o*/ register req * r)
  -
  -    {
  -    int          rc = ok ;
  -    SV *    pBufSV = NULL ;
  -    req *   pMain = r ;
  -
  -#ifdef EP2
  -    if (!r -> Component.Config.bEP1Compat)
  -     {
  -     SV * * ppSV ;
  -     
  -     ppSV = hv_fetch (r -> Buf.pFile -> pCacheHash, "P-1----", 7, 0) ;
  -     if (ppSV && *ppSV)
  -         {
  -         r -> Component.pBuf             = NULL ;
  -         r -> Buf.pFile -> nFilesize     = 1 ;
  -         return ok ;  /* source already parsed */
  -         }
  -     }
  -#endif
  -
  -    if ((pBufSV = r -> Buf.pFile -> pBufSV) == NULL || !SvPOK (pBufSV))
  -     {
  -     if (SvROK(r -> Component.Param.pInput))
  -         { /* --- get input from memory --- */
  -         STRLEN n ;
  -         r -> Component.pBuf = SvPV (pBufSV = SvRV(r -> Component.Param.pInput), n) 
;
  -         r -> Buf.pFile -> nFilesize = n ; 
  -         }
  -
  -     else
  -         {
  -         /* --- read input file --- */
  -         rc = ReadHTML (r, r -> Component.sSourcefile, &r -> Buf.pFile -> 
nFilesize, &pBufSV) ;
  -         if (rc == ok)
  -             r -> Component.pBuf = SvPVX (pBufSV) ;
  -         }
  -     
  -     if (rc == ok)
  -         {
  -         SvREFCNT_inc (pBufSV) ;
  -         r -> Buf.pFile -> pBufSV = pBufSV ;
  -         r -> Component.pEndPos  = r -> Component.pBuf + r -> Buf.pFile -> 
nFilesize ;
  -         
  -         if (r -> Buf.pFile -> pNext2Free == NULL)
  -             {
  -             /* --- add to list for freeing --- */
  -         
  -             while (pMain && pMain -> pLastReq != &InitialReq)
  -                 pMain = pMain -> pLastReq ;
  -
  -             if ((r -> Buf.pFile -> pNext2Free = pMain -> pFiles2Free) == NULL)
  -                 r -> Buf.pFile -> pNext2Free  = r -> Buf.pFile ; /* last one 
points to itself !! */
  -             pMain -> pFiles2Free = r -> Buf.pFile ;
  -             }
  -         
  -         /* SetupDebugger (r) ; */
  -         }
  -     }
  -    else
  -     {
  -     r -> Component.pBuf                 = SvPVX (pBufSV) ;
  -     r -> Buf.pFile -> nFilesize = SvCUR (pBufSV) ;
  -     }
  -
  -    return rc ;
  -    }
  -
  -/* ---------------------------------------------------------------------------- */
  -/*                                                                              */
  -/* Process a block of the file                                               */
  -/*                                                                              */
  -/* ---------------------------------------------------------------------------- */
  -
  -    
  -
  -int ProcessSub               (/*i/o*/ register req * r,
  -                      /*in*/  tFile * pFile,
  -                      /*in*/  int     nBlockStart,
  -                         /*in*/  int     nBlockNo)
  -
  -    {
  -    int          rc ;
  -    tSrcBuf Buf ;
  -    char *  sEvalPackage = r -> Component.sEvalPackage ; 
  -    STRLEN  nEvalPackage = r -> Component.nEvalPackage ;  
  -    SV *    pInData      = r -> Component.Param.pInput  ;  
  -
  -
  -    /*av_unshift (GvAV (PL_defgv), 1) ;
  -    av_store   (GvAV (PL_defgv), 0, r -> _perlsv) ; */
  -    
  -    memcpy (&Buf, &r -> Buf, sizeof (Buf)) ;
  -
  -    
  -    if (pFile != r -> Buf.pFile)
  -     { /* get other file */
  -     r -> Buf.pFile = pFile ;
  -     r -> Component.Param.pInput = &sv_undef ;
  -
  -     if ((rc = ReadInputFile (r)) != ok)
  -         {
  -         LogError (r, rc) ;
  -         return rc ;
  -         }
  -
  -     r -> Component.pSourcelinePos =  r -> Component.pBuf ;
  -     r -> Component.nSourceline = r -> Component.Param.nFirstLine ;
  -     r -> Component.pLineNoCurrPos = NULL ;    
  -     r -> Component.sEvalPackage   = r -> Buf.pFile -> sCurrPackage ; 
  -     r -> Component.nEvalPackage   = r -> Buf.pFile -> nCurrPackage ; 
  -     }
  -
  -    r -> nInsideSub++ ;
  -    rc = ProcessBlock (r, nBlockStart, r -> Buf.pFile -> nFilesize - nBlockStart, 
nBlockNo) ;
  -    r -> nInsideSub-- ;
  -
  -    memcpy (&r -> Buf, &Buf, sizeof (Buf)) ;
  -    r -> Component.sEvalPackage = sEvalPackage ; 
  -    r -> Component.nEvalPackage = nEvalPackage ; 
  -    r -> Component.Param.pInput          = pInData ;  
  -
  -    if (rc != ok)
  -     LogError (r, rc) ;
  -
  -    return rc ;
  -    }
  -
  -#endif
       
   /* ---------------------------------------------------------------------------- */
   /*                                                                              */
  @@ -2361,6 +1498,51 @@
           embperl_ExecuteRequest (r) ;
   
       embperl_CleanupRequest (r) ;
  +
  +    return rc ;
  +    }
  +    
  +
  +
  +int     embperl_RunComponent(/*in*/ tReq *           r,
  +                             /*in*/ SV *             pPerlParam)
  +
  +
  +    {
  +    epTHX_
  +    int rc ;
  +    tComponent * pComponent ;
  +
  +    rc = embperl_SetupComponent  (r, pPerlParam, &pComponent) ;
  +
  +    if (rc == ok)
  +        {
  +        ENTER;
  +        SAVETMPS ;
  +     
  +        r -> Component.bReqRunning     = 1 ;
  +
  +        if ((r -> Component.Config.bOptions & optEarlyHttpHeader) == 0)
  +            oBegin (r) ;
  +
  +        if ((rc = ProcessFile (r, 0 /*r -> Buf.pFile -> nFilesize*/)) != ok)
  +            if (rc == rcExit)
  +                rc = ok ;
  +            else
  +                LogError (r, rc) ;
  +
  +        
  +        /* --- Restore Operatormask and Package, destroy temp perl sv's --- */
  +        FREETMPS ;
  +        LEAVE;
  +        r -> Component.bReqRunning = 0 ;
  +
  +        /* --- send http header and data to the browser if not already done --- */
  +        if ((rc = EndOutput (r, rc, r -> Component.Param.pOutput)) != ok)
  +            LogError (r, rc) ;
  +
  +        embperl_CleanupComponent  (r, pComponent) ;
  +        }
   
       return rc ;
       }
  
  
  
  1.1.2.11  +8 -2      embperl/Attic/eppriv.h
  
  Index: eppriv.h
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/eppriv.h,v
  retrieving revision 1.1.2.10
  retrieving revision 1.1.2.11
  diff -u -r1.1.2.10 -r1.1.2.11
  --- eppriv.h  24 Jan 2002 08:37:05 -0000      1.1.2.10
  +++ eppriv.h  25 Jan 2002 07:04:31 -0000      1.1.2.11
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: eppriv.h,v 1.1.2.10 2002/01/24 08:37:05 richter Exp $
  +#   $Id: eppriv.h,v 1.1.2.11 2002/01/25 07:04:31 richter Exp $
   #
   
###################################################################################*/
   
  @@ -45,6 +45,7 @@
   void boot_Embperl__Component (pTHX_ CV * cv) ;
   void boot_Embperl__Component__Config (pTHX_ CV * cv) ;
   void boot_Embperl__Component__Param (pTHX_ CV * cv) ;
  +void boot_Embperl__Syntax (pTHX_ CV * cv) ;
   
   
   struct tCacheItem ;
  @@ -196,7 +197,12 @@
                                   /*in*/ tMemPool    * pPool,
                                   /*out*/ tReqParam  * pParam) ;
   
  +int    embperl_SetupComponent  (/*in*/ tReq *                 r,
  +                                /*in*/ SV *                   pPerlParam,
  +                                /*out*/tComponent * *         ppComponent) ;
   
  +int    embperl_CleanupComponent  (/*in*/ tReq *                r,
  +                                  /*in*/ tComponent *          c) ;
   
   /* --- init --- */
   
  @@ -205,7 +211,7 @@
   void embperl_DefaultComponentConfig (/*in*/ tComponentConfig  *pCfg) ;
   
   void Embperl__App_new_init(pTHX_ tApp * pApp, SV * pPerlParam, int overwrite) ;
  -void Embperl__App__Config_new_init(pTHX_ tApp * pApp, SV * pPerlParam, int 
overwrite) ;
  +void Embperl__App__Config_new_init(pTHX_ tApp * pAppConfig, SV * pPerlParam, int 
overwrite) ;
   void Embperl__Req_new_init (pTHX_ tReq * r, SV * pPerlParam, int overwrite) ;
   void Embperl__Req__Config_new_init (pTHX_ tReqConfig * r, SV * pPerlParam, int 
overwrite) ;
   void Embperl__Req__Param_new_init (pTHX_ tReqParam * r, SV * pPerlParam, int 
overwrite) ;
  
  
  
  1.1.2.6   +4 -1      embperl/Attic/eppublic.h
  
  Index: eppublic.h
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/eppublic.h,v
  retrieving revision 1.1.2.5
  retrieving revision 1.1.2.6
  diff -u -r1.1.2.5 -r1.1.2.6
  --- eppublic.h        23 Jan 2002 07:58:27 -0000      1.1.2.5
  +++ eppublic.h        25 Jan 2002 07:04:31 -0000      1.1.2.6
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: eppublic.h,v 1.1.2.5 2002/01/23 07:58:27 richter Exp $
  +#   $Id: eppublic.h,v 1.1.2.6 2002/01/25 07:04:31 richter Exp $
   #
   
###################################################################################*/
   
  @@ -32,6 +32,9 @@
   int     embperl_RunRequest  (pTHX_
                                SV *             pApacheReqSV,
                                SV *             pPerlParam) ;
  +
  +int     embperl_RunComponent(/*in*/ tReq *           r,
  +                             /*in*/ SV *             pPerlParam) ;
   
   int    embperl_CleanupRequest (tReq *  r) ;
   
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.3   +2 -2      embperl/Embperl/Attic/Util.pm
  
  Index: Util.pm
  ===================================================================
  RCS file: /home/cvs/embperl/Embperl/Attic/Util.pm,v
  retrieving revision 1.1.2.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- Util.pm   24 Jan 2002 08:37:06 -0000      1.1.2.2
  +++ Util.pm   25 Jan 2002 07:04:32 -0000      1.1.2.3
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: Util.pm,v 1.1.2.2 2002/01/24 08:37:06 richter Exp $
  +#   $Id: Util.pm,v 1.1.2.3 2002/01/25 07:04:32 richter Exp $
   #
   ###################################################################################
   
  @@ -103,7 +103,7 @@
                       
   
           *{"$package\:\:MailFormTo"} = \&Embperl::MailFormTo ;
  -        *{"$package\:\:Execute"} = \&Embperl::Execute ;
  +        *{"$package\:\:Execute"} = \&Embperl::Req::ExecuteComponent ;
   
           tie *{"$package\:\:LOG"}, 'Embperl::Log' ;
           tie *{"$package\:\:OUT"}, 'Embperl::Out' ;
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to