Browse Source

* Patch from Dennis (Bug ID 25534) to add some APR functions to the interface

git-svn-id: trunk@26573 -
michael 11 years ago
parent
commit
7a3cd62e3a

+ 1 - 0
packages/httpd24/fpmake.pp

@@ -59,6 +59,7 @@ begin
           AddInclude('http_config.inc');
           AddInclude('http_config.inc');
           AddInclude('http_core.inc');
           AddInclude('http_core.inc');
           AddInclude('util_filter.inc');
           AddInclude('util_filter.inc');
+          AddInclude('util_script.inc');
           AddInclude('http_log.inc');
           AddInclude('http_log.inc');
           AddInclude('http_protocol.inc');
           AddInclude('http_protocol.inc');
           AddInclude('aprutil/apr_buckets.inc');
           AddInclude('aprutil/apr_buckets.inc');

+ 0 - 1
packages/httpd24/src/apr/apr24.pas

@@ -138,5 +138,4 @@ type
 
 
 implementation
 implementation
 
 
-
 end.
 end.

+ 9 - 2
packages/httpd24/src/apr/apr_tables.inc

@@ -53,6 +53,7 @@
 type
 type
   apr_table_t = record end;
   apr_table_t = record end;
   Papr_table_t = ^apr_table_t;
   Papr_table_t = ^apr_table_t;
+  PPapr_table_t = ^Papr_table_T;
 
 
 //** @see apr_array_header_t */
 //** @see apr_array_header_t */
 //typedef struct apr_array_header_t apr_array_header_t;
 //typedef struct apr_array_header_t apr_array_header_t;
@@ -458,7 +459,7 @@ function apr_table_overlay(t: Papr_table_t;
 //typedef int (apr_table_do_callback_fn_t)(void *rec, const char *key,
 //typedef int (apr_table_do_callback_fn_t)(void *rec, const char *key,
 //                                                    const char *value);
 //                                                    const char *value);
 type
 type
-  apr_table_do_callback_fn_t = function (rec: Pointer; const key, value: PChar): Integer;
+  apr_table_do_callback_fn_t = function (rec: Pointer; const key, value: PChar): Integer; cdecl;
   Papr_table_do_callback_fn_t = ^apr_table_do_callback_fn_t;
   Papr_table_do_callback_fn_t = ^apr_table_do_callback_fn_t;
 
 
 {**
 {**
@@ -487,6 +488,12 @@ type
 //#endif
 //#endif
 //    ;
 //    ;
 
 
+// This has to be a GNU C-Declaration
+
+function apr_table_do(comp: apr_table_do_callback_fn_t; rec: Pointer;
+  t: Papr_table_t): Integer; cdecl; varargs;
+  external LibAPR Name 'apr_table_do';
+
 {**
 {**
  * Iterate over a table running the provided function once for every
  * Iterate over a table running the provided function once for every
  * element in the table.  The @param vp varargs parameter must be a
  * element in the table.  The @param vp varargs parameter must be a
@@ -509,7 +516,7 @@ type
 //APR_DECLARE(int) apr_table_vdo(apr_table_do_callback_fn_t *comp,
 //APR_DECLARE(int) apr_table_vdo(apr_table_do_callback_fn_t *comp,
 //                               void *rec, const apr_table_t *t, va_list vp);
 //                               void *rec, const apr_table_t *t, va_list vp);
 function apr_table_vdo(comp: Papr_table_do_callback_fn_t;
 function apr_table_vdo(comp: Papr_table_do_callback_fn_t;
-                       rec: Pointer; const t: Papr_table_t; vp: va_list): Integer;
+                       rec: Pointer; t: Papr_table_t; vp: va_list): Integer;
   {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
   {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
   external LibAPR name LibNamePrefix + 'apr_table_vdo' + LibSuff16;
   external LibAPR name LibNamePrefix + 'apr_table_vdo' + LibSuff16;
 
 

+ 21 - 21
packages/httpd24/src/aprutil/apr_buckets.inc

@@ -49,6 +49,10 @@
 const
 const
 //** default bucket buffer size - 8KB minus room for memory allocator headers */
 //** default bucket buffer size - 8KB minus room for memory allocator headers */
   APR_BUCKET_BUFF_SIZE = 8000;
   APR_BUCKET_BUFF_SIZE = 8000;
+//** This bucket type represents actual data to send to the client. */
+  APR_BUCKET_DATA = 0;
+//** This bucket type represents metadata. */
+  APR_BUCKET_METADATA = 1;
 
 
 //** Determines how a bucket or brigade should be read */
 //** Determines how a bucket or brigade should be read */
 type
 type
@@ -132,16 +136,8 @@ Papr_bucket_alloc_t = ^apr_bucket_alloc_t;
 //typedef struct apr_bucket_type_t apr_bucket_type_t;
 //typedef struct apr_bucket_type_t apr_bucket_type_t;
 Papr_bucket_type_t = ^apr_bucket_type_t;
 Papr_bucket_type_t = ^apr_bucket_type_t;
 
 
-{from below}
-is_metadata = (
-  //** This bucket type represents actual data to send to the client. */
-  APR_BUCKET_DATA = 0,
-  //** This bucket type represents metadata. */
-  APR_BUCKET_METADATA = 1
-);
-
 //    void ( *destroy)(void *data);
 //    void ( *destroy)(void *data);
-  destroy_t = procedure(data: Pointer);
+  destroy_t = procedure(data: Pointer); cdecl;
 
 
 //    apr_status_t ( *read)(apr_bucket *b, const char **str, apr_size_t *len,
 //    apr_status_t ( *read)(apr_bucket *b, const char **str, apr_size_t *len,
 //                         apr_read_type_e block);
 //                         apr_read_type_e block);
@@ -181,7 +177,7 @@ is_metadata = (
      * that are the "content" of the brigade and "metadata" describes
      * that are the "content" of the brigade and "metadata" describes
      * that data but is not a proper part of it.
      * that data but is not a proper part of it.
      *}
      *}
-{is_metadata is moved up}
+    is_metadata : integer;
 //    enum {
 //    enum {
 //        /** This bucket type represents actual data to send to the client. */
 //        /** This bucket type represents actual data to send to the client. */
 //        APR_BUCKET_DATA = 0,
 //        APR_BUCKET_DATA = 0,
@@ -253,7 +249,7 @@ is_metadata = (
 
 
 {from below}
 {from below}
 //    void (*free)(void *e);
 //    void (*free)(void *e);
-  free_t = procedure(e: Pointer);
+  free_t = procedure(e: Pointer); cdecl;
 
 
   link_t = record
   link_t = record
     next: Papr_bucket;
     next: Papr_bucket;
@@ -341,7 +337,7 @@ is_metadata = (
  * Function called when a brigade should be flushed
  * Function called when a brigade should be flushed
  *}
  *}
 //typedef apr_status_t (*apr_brigade_flush)(apr_bucket_brigade *bb, void *ctx);
 //typedef apr_status_t (*apr_brigade_flush)(apr_bucket_brigade *bb, void *ctx);
-apr_brigade_flush = function(bb: Papr_bucket_brigade; ctx: Pointer): apr_status_t;
+apr_brigade_flush = function(bb: Papr_bucket_brigade; ctx: Pointer): apr_status_t; cdecl;
 
 
 (*  fpc -> big part ignored here
 (*  fpc -> big part ignored here
 {*
 {*
@@ -392,14 +388,12 @@ apr_brigade_flush = function(bb: Papr_bucket_brigade; ctx: Pointer): apr_status_
  * @return The magic pointer value
  * @return The magic pointer value
  */
  */
 #define APR_BRIGADE_SENTINEL(b)	APR_RING_SENTINEL(&(b)->list, apr_bucket, link)
 #define APR_BRIGADE_SENTINEL(b)	APR_RING_SENTINEL(&(b)->list, apr_bucket, link)
-
 /**
 /**
  * Determine if the bucket brigade is empty
  * Determine if the bucket brigade is empty
  * @param b The brigade to check
  * @param b The brigade to check
  * @return true or false
  * @return true or false
  */
  */
 #define APR_BRIGADE_EMPTY(b)	APR_RING_EMPTY(&(b)->list, apr_bucket, link)
 #define APR_BRIGADE_EMPTY(b)	APR_RING_EMPTY(&(b)->list, apr_bucket, link)
-
 /**
 /**
  * Return the first bucket in a brigade
  * Return the first bucket in a brigade
  * @param b The brigade to query
  * @param b The brigade to query
@@ -412,7 +406,6 @@ apr_brigade_flush = function(bb: Papr_bucket_brigade; ctx: Pointer): apr_status_
  * @return The last bucket in the brigade
  * @return The last bucket in the brigade
  */
  */
 #define APR_BRIGADE_LAST(b)	APR_RING_LAST(&(b)->list)
 #define APR_BRIGADE_LAST(b)	APR_RING_LAST(&(b)->list)
-
 /**
 /**
  * Insert a list of buckets at the front of a brigade
  * Insert a list of buckets at the front of a brigade
  * @param b The brigade to add to
  * @param b The brigade to add to
@@ -489,13 +482,11 @@ apr_brigade_flush = function(bb: Papr_bucket_brigade; ctx: Pointer): apr_status_
  * @return The previous bucket
  * @return The previous bucket
  */
  */
 #define APR_BUCKET_PREV(e)	APR_RING_PREV((e), link)
 #define APR_BUCKET_PREV(e)	APR_RING_PREV((e), link)
-
 /**
 /**
  * Remove a bucket from its bucket brigade
  * Remove a bucket from its bucket brigade
  * @param e The bucket to remove
  * @param e The bucket to remove
  */
  */
 #define APR_BUCKET_REMOVE(e)	APR_RING_REMOVE((e), link)
 #define APR_BUCKET_REMOVE(e)	APR_RING_REMOVE((e), link)
-
 /**
 /**
  * Initialize a new bucket's prev/next pointers
  * Initialize a new bucket's prev/next pointers
  * @param e The bucket to initialize
  * @param e The bucket to initialize
@@ -509,7 +500,6 @@ apr_brigade_flush = function(bb: Papr_bucket_brigade; ctx: Pointer): apr_status_
  * @return true or false
  * @return true or false
  */
  */
 #define APR_BUCKET_IS_METADATA(e)    ((e)->type->is_metadata)
 #define APR_BUCKET_IS_METADATA(e)    ((e)->type->is_metadata)
-
 /**
 /**
  * Determine if a bucket is a FLUSH bucket
  * Determine if a bucket is a FLUSH bucket
  * @param e The bucket to inspect
  * @param e The bucket to inspect
@@ -607,7 +597,7 @@ Papr_bucket_heap = ^apr_bucket_heap;
 
 
 {from below}
 {from below}
 //    void (*free_func)(void *data);
 //    void (*free_func)(void *data);
-free_func_t = procedure (data: Pointer);
+free_func_t = procedure (data: Pointer); cdecl;
 
 
 {**
 {**
  * A bucket referring to data allocated off the heap.
  * A bucket referring to data allocated off the heap.
@@ -819,8 +809,13 @@ APU_DECLARE(apr_status_t) apr_brigade_partition(apr_bucket_brigade *b,
  */
  */
 APU_DECLARE(apr_status_t) apr_brigade_length(apr_bucket_brigade *bb,
 APU_DECLARE(apr_status_t) apr_brigade_length(apr_bucket_brigade *bb,
                                              int read_all,
                                              int read_all,
-                                             apr_off_t *length);
+                                             apr_off_t *length);*)
 
 
+function apr_brigade_length(bb: Papr_bucket_brigade; read_all: Integer;
+  length: Papr_off_t): apr_status_t; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+  external LibAPRUtil name LibNamePrefix + 'apr_brigade_length' + LibSuff12;
+
+(*
 /**
 /**
  * Take a bucket brigade and store the data in a flat char*
  * Take a bucket brigade and store the data in a flat char*
  * @param bb The bucket brigade to create the char* from
  * @param bb The bucket brigade to create the char* from
@@ -830,8 +825,13 @@ APU_DECLARE(apr_status_t) apr_brigade_length(apr_bucket_brigade *bb,
  */
  */
 APU_DECLARE(apr_status_t) apr_brigade_flatten(apr_bucket_brigade *bb,
 APU_DECLARE(apr_status_t) apr_brigade_flatten(apr_bucket_brigade *bb,
                                               char *c,
                                               char *c,
-                                              apr_size_t *len);
+                                              apr_size_t *len);*)
+
+function apr_brigade_flatten(bb: Papr_bucket_brigade; c: Pchar;
+  len: Papr_size_t): apr_status_t;{$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+  external LibAPRUtil name LibNamePrefix + 'apr_brigade_flatten' + LibSuff12;
 
 
+(*
 /**
 /**
  * Creates a pool-allocated string representing a flat bucket brigade
  * Creates a pool-allocated string representing a flat bucket brigade
  * @param bb The bucket brigade to create the char array from
  * @param bb The bucket brigade to create the char array from

+ 15 - 7
packages/httpd24/src/http_config.inc

@@ -119,6 +119,14 @@ type
 
 
 //#if defined(AP_HAVE_DESIGNATED_INITIALIZER) || defined(DOXYGEN)
 //#if defined(AP_HAVE_DESIGNATED_INITIALIZER) || defined(DOXYGEN)
 
 
+  tnoargsfunc   = function(parms: Pcmd_parms; mconfig: pointer): Pchar; cdecl;
+  trawargsfunc  = function(parms: Pcmd_parms; mconfig: pointer; args: Pchar): Pchar; cdecl;
+  ttakeargvfunc = function(parms: Pcmd_parms; mconfig: pointer; argc: longint; argv: PPchar): Pchar; cdecl;
+  ttake1func    = function(parms: Pcmd_parms; mconfig: pointer; w: Pchar): Pchar; cdecl;
+  ttake2func    = function(parms: Pcmd_parms; mconfig: pointer; w, w2: Pchar): Pchar; cdecl;
+  ttake3func    = function(parms: Pcmd_parms; mconfig: pointer; w, w2, w3: Pchar): Pchar; cdecl;
+  tflagfunc     = function(parms: Pcmd_parms; mconfig: pointer; on_: longint): Pchar; cdecl;
+
 {**
 {**
  * All the types of functions that can be used in directives
  * All the types of functions that can be used in directives
  * @internal
  * @internal
@@ -126,25 +134,25 @@ type
   cmd_func = record
   cmd_func = record
      case longint of
      case longint of
        {** function to call for a no-args *}
        {** function to call for a no-args *}
-       0 : ( no_args : function (parms:Pcmd_parms; mconfig:pointer):Pchar;cdecl; );
+       0 : ( no_args : tnoargsfunc);
 
 
        {** function to call for a raw-args *}
        {** function to call for a raw-args *}
-       1 : ( raw_args : function (parms:Pcmd_parms; mconfig:pointer; args:Pchar):Pchar;cdecl; );
+       1 : ( raw_args : trawargsfunc);
 
 
        {** function to call for a argv/argc *}
        {** function to call for a argv/argc *}
-       2 : ( take_argv : function (parms:Pcmd_parms; mconfig:pointer; argc:longint; argv:PPchar):Pchar;cdecl; );
+       2 : ( take_argv : ttakeargvfunc);
 
 
        {** function to call for a take1 *}
        {** function to call for a take1 *}
-       3 : ( take1 : function (parms:Pcmd_parms; mconfig:pointer; w:Pchar):Pchar;cdecl; );
+       3 : ( take1 : ttake1func);
 
 
        {** function to call for a take2 *}
        {** function to call for a take2 *}
-       4 : ( take2 : function (parms:Pcmd_parms; mconfig:pointer; w:Pchar; w2:Pchar):Pchar;cdecl; );
+       4 : ( take2 : ttake2func);
 
 
        {** function to call for a take3 *}
        {** function to call for a take3 *}
-       5 : ( take3 : function (parms:Pcmd_parms; mconfig:pointer; w:Pchar; w2:Pchar; w3:Pchar):Pchar;cdecl; );
+       5 : ( take3 : ttake3func);
 
 
        {** function to call for a flag *}
        {** function to call for a flag *}
-       6 : ( flag : function (parms:Pcmd_parms; mconfig:pointer; on_:longint):Pchar;cdecl; );
+       6 : ( flag : tflagfunc);
      end;
      end;
   Pcmd_func = ^cmd_func;
   Pcmd_func = ^cmd_func;
 (*
 (*

+ 234 - 1
packages/httpd24/src/httpd24.pas

@@ -43,6 +43,7 @@
  * @
  * @
   }
   }
 unit httpd24;
 unit httpd24;
+
 {$ifdef fpc}
 {$ifdef fpc}
   {$mode delphi}{$H+}
   {$mode delphi}{$H+}
 {$endif}
 {$endif}
@@ -50,6 +51,8 @@ unit httpd24;
   {$PACKRECORDS C}
   {$PACKRECORDS C}
 {$endif}
 {$endif}
 
 
+{$PACKENUM 4}
+
 {$IFDEF Apache1_3}
 {$IFDEF Apache1_3}
   {$WARNING Apache1_3 is defined somewhere, but the HTTPD unit included is for Apache2_4}
   {$WARNING Apache1_3 is defined somewhere, but the HTTPD unit included is for Apache2_4}
 {$ENDIF}
 {$ENDIF}
@@ -158,11 +161,101 @@ type
 //{$include http_connection.inc}
 //{$include http_connection.inc}
 //{$include http_vhost.inc}
 //{$include http_vhost.inc}
 
 
-//{$include util_script.inc}
+{$include util_script.inc}
 //{$include util_time.inc}
 //{$include util_time.inc}
 //{$include util_md5.inc}
 //{$include util_md5.inc}
 //{$include ap_mpm.inc}
 //{$include ap_mpm.inc}
 
 
+// APRUtil External Variables //
+
+var
+
+  {/* All of the bucket types implemented by the core */
+  /**
+   * The flush bucket type.  This signifies that all data should be flushed to
+   * the next filter.  The flush bucket should be sent with the other buckets.
+   */}
+  apr_bucket_type_flush: apr_bucket_type_t external LibAPRUtil;
+  {/**
+   * The EOS bucket type.  This signifies that there will be no more data, ever.
+   * All filters MUST send all data to the next filter when they receive a
+   * bucket of this type
+   */}
+  apr_bucket_type_eos: apr_bucket_type_t external LibAPRUtil;
+  {/**
+   * The FILE bucket type.  This bucket represents a file on disk
+   */}
+  apr_bucket_type_file: apr_bucket_type_t external LibAPRUtil;
+  {/**
+   * The HEAP bucket type.  This bucket represents a data allocated from the
+   * heap.
+   */}
+  apr_bucket_type_heap: apr_bucket_type_t external LibAPRUtil;
+  {$IFDEF APR_HAS_MMAP}
+    {/**
+     * The MMAP bucket type.  This bucket represents an MMAP'ed file
+     */}
+    apr_bucket_type_mmap: apr_bucket_type_t external LibAPRUtil;
+  {$ENDIF}
+  {/**
+   * The POOL bucket type.  This bucket represents a data that was allocated
+   * from a pool.  IF this bucket is still available when the pool is cleared,
+   * the data is copied on to the heap.
+   */}
+  apr_bucket_type_pool: apr_bucket_type_t external LibAPRUtil;
+  {/**
+   * The PIPE bucket type.  This bucket represents a pipe to another program.
+   */}
+  apr_bucket_type_pipe: apr_bucket_type_t external LibAPRUtil;
+  {/**
+   * The IMMORTAL bucket type.  This bucket represents a segment of data that
+   * the creator is willing to take responsibility for.  The core will do
+   * nothing with the data in an immortal bucket
+   */}
+  apr_bucket_type_immortal: apr_bucket_type_t external LibAPRUtil;
+  {/**
+   * The TRANSIENT bucket type.  This bucket represents a data allocated off
+   * the stack.  When the setaside function is called, this data is copied on
+   * to the heap
+   */}
+  apr_bucket_type_transient: apr_bucket_type_t external LibAPRUtil;
+  {/**
+   * The SOCKET bucket type.  This bucket represents a socket to another machine
+   */}
+  apr_bucket_type_socket: apr_bucket_type_t external LibAPRUtil;
+
+//********************************************************************
+  { from apr_buckets.inc }
+
+  function APR_BRIGADE_SENTINEL(b: Papr_bucket_brigade): Papr_bucket;
+  function APR_BRIGADE_FIRST(b: Papr_bucket_brigade): Papr_bucket;
+  function APR_BRIGADE_LAST(b: Papr_bucket_brigade): Papr_bucket;
+  function APR_BUCKET_NEXT(e: Papr_bucket): Papr_bucket;
+  function APR_BUCKET_PREV(e: Papr_bucket): Papr_bucket;
+  procedure APR_BUCKET_REMOVE(e: Papr_bucket);
+  function APR_BUCKET_IS_METADATA(e: Papr_bucket): boolean;
+  function APR_BUCKET_IS_FLUSH(e: Papr_bucket): boolean;
+  function APR_BUCKET_IS_EOS(e: Papr_bucket): boolean;
+  function APR_BUCKET_IS_FILE(e: Papr_bucket): boolean;
+  function APR_BUCKET_IS_PIPE(e: Papr_bucket): boolean;
+  function APR_BUCKET_IS_SOCKET(e: Papr_bucket): boolean;
+  function APR_BUCKET_IS_HEAP(e: Papr_bucket): boolean;
+  function APR_BUCKET_IS_TRANSIENT(e: Papr_bucket): boolean;
+  function APR_BUCKET_IS_IMMORTAL(e: Papr_bucket): boolean;
+  {$IFDEF APR_HAS_MMAP}
+    function APR_BUCKET_IS_MMAP(e: Papr_bucket): boolean;
+  {$ENDIF}
+  function APR_BUCKET_IS_POOL(e: Papr_bucket): boolean;
+  function apr_bucket_read(e: Papr_bucket; const str: PPChar; len: Papr_size_t;
+    block: apr_read_type_e): apr_status_t;
+
+  function AP_INIT_TAKE1(directive: Pchar; const take1func : ttake1func;
+    mconfig: Pointer; where: Integer; help: Pchar): command_rec;
+  function AP_INIT_TAKE2(directive: Pchar; const take2func: ttake2func;
+    mconfig: Pointer; where: Integer; help: Pchar): command_rec;
+  function AP_INIT_TAKE3(directive: Pchar; const take3func: ttake3func;
+    mconfig: Pointer; where: Integer; help: Pchar): command_rec;
+
 implementation
 implementation
   { Internal representation for a HTTP protocol number, e.g., HTTP/1.1 }
   { Internal representation for a HTTP protocol number, e.g., HTTP/1.1 }
   function HTTP_VERSION(major, minor: Integer): Integer;
   function HTTP_VERSION(major, minor: Integer): Integer;
@@ -244,6 +337,146 @@ implementation
     ap_escape_html:=ap_escape_html2(p,s,0);
     ap_escape_html:=ap_escape_html2(p,s,0);
   end;
   end;
 
 
+//********************************************************************
+  { from apr_buckets.inc }
+
+  function APR_BRIGADE_FIRST(b: Papr_bucket_brigade): Papr_bucket; inline;
+  begin
+    APR_BRIGADE_FIRST := b^.list.next;
+  end;
+
+  function APR_BRIGADE_LAST(b: Papr_bucket_brigade): Papr_bucket; inline;
+  begin
+    APR_BRIGADE_LAST := b^.list.prev;
+  end;
+
+  function APR_BRIGADE_SENTINEL(b: Papr_bucket_brigade): Papr_bucket; inline;
+  var b_: apr_bucket; // This should technically be <type> and link shouldn't be hard-coded..
+  begin
+    APR_BRIGADE_SENTINEL := Papr_bucket(pointer(@b^.list.next) - (pointer(@b_.Link) - pointer(@b_) ) );
+  end;
+
+  function APR_BUCKET_IS_METADATA(e: Papr_bucket): boolean; inline;
+  begin
+    APR_BUCKET_IS_METADATA := e^.type_^.is_metadata = APR_BUCKET_METADATA;
+  end;
+
+  function APR_BUCKET_IS_FLUSH(e: Papr_bucket): boolean; inline;
+  begin
+    APR_BUCKET_IS_FLUSH := e^.type_ = @apr_bucket_type_flush;
+  end;
+
+  function APR_BUCKET_IS_EOS(e: Papr_bucket): boolean; inline;
+  begin
+    APR_BUCKET_IS_EOS := e^.type_ = @apr_bucket_type_eos;
+  end;
+
+  function APR_BUCKET_IS_FILE(e: Papr_bucket): boolean; inline;
+  begin
+    APR_BUCKET_IS_FILE := e^.type_ = @apr_bucket_type_file;
+  end;
+
+  function APR_BUCKET_IS_PIPE(e: Papr_bucket): boolean; inline;
+  begin
+    APR_BUCKET_IS_PIPE := e^.type_ = @apr_bucket_type_pipe;
+  end;
+
+  function APR_BUCKET_IS_SOCKET(e: Papr_bucket): boolean; inline;
+  begin
+    APR_BUCKET_IS_SOCKET := e^.type_ = @apr_bucket_type_socket;
+  end;
+
+  function APR_BUCKET_IS_HEAP(e: Papr_bucket): boolean; inline;
+  begin
+    APR_BUCKET_IS_HEAP := e^.type_ = @apr_bucket_type_heap;
+  end;
+
+  function APR_BUCKET_IS_TRANSIENT(e: Papr_bucket): boolean; inline;
+  begin
+    APR_BUCKET_IS_TRANSIENT := e^.type_ = @apr_bucket_type_transient;
+  end;
+
+  function APR_BUCKET_IS_IMMORTAL(e: Papr_bucket): boolean; inline;
+  begin
+    APR_BUCKET_IS_IMMORTAL := e^.type_ = @apr_bucket_type_immortal;
+  end;
+
+  {$IFDEF APR_HAS_MMAP}
+    function APR_BUCKET_IS_MMAP(e: Papr_bucket): boolean; inline;
+    begin
+      APR_BUCKET_IS_MMAP := e^.type_ = @apr_bucket_type_mmap;
+    end;
+  {$ENDIF}
+
+  function APR_BUCKET_IS_POOL(e: Papr_bucket): boolean; inline;
+  begin
+    APR_BUCKET_IS_POOL := e^.type_ = @apr_bucket_type_pool;
+  end;
+
+  function APR_BUCKET_NEXT(e: Papr_bucket): Papr_bucket; inline;
+  begin
+    APR_BUCKET_NEXT := e^.link.next;
+  end;
+
+  function APR_BUCKET_PREV(e: Papr_bucket): Papr_bucket; inline;
+  begin
+    APR_BUCKET_PREV := e^.link.prev;
+  end;
+
+  procedure APR_BUCKET_REMOVE(e: Papr_bucket); inline;
+  begin
+    APR_BUCKET_PREV(e)^.link.next := APR_BUCKET_NEXT(e);
+    APR_BUCKET_NEXT(e)^.link.prev := APR_BUCKET_PREV(e);
+  end;
+
+  function apr_bucket_read(e: Papr_bucket; const str: PPChar; len: Papr_size_t;
+    block: apr_read_type_e): apr_status_t; inline;
+  begin
+    apr_bucket_read := e^.type_^.read(e, str, len, block);
+  end;
+
+  function AP_INIT_TAKE1(directive: Pchar; const take1func: ttake1func;
+    mconfig: Pointer; where: Integer; help: Pchar): command_rec; inline;
+  begin
+    with result DO
+    begin
+      name         := directive;
+      func.take1   := take1func;
+      cmd_data     := mconfig;
+      req_override := where;
+      args_how     := TAKE1;
+      errmsg       := help;
+    end;
+  end;
+
+  function AP_INIT_TAKE2(directive: Pchar; const take2func: ttake2func;
+    mconfig: Pointer; where: Integer; help: Pchar): command_rec; inline;
+  begin
+    with result DO
+    begin
+      name         := directive;
+      func.take2   := take2func;
+      cmd_data     := mconfig;
+      req_override := where;
+      args_how     := TAKE2;
+      errmsg       := help;
+    end;
+  end;
+
+  function AP_INIT_TAKE3(directive: Pchar; const take3func: ttake3func;
+    mconfig: Pointer; where: Integer; help: Pchar): command_rec; inline;
+  begin
+    with result DO
+    begin
+      name         := directive;
+      func.take3   := take3func;
+      cmd_data     := mconfig;
+      req_override := where;
+      args_how     := TAKE3;
+      errmsg       := help;
+    end;
+  end;
+
 //********************************************************************
 //********************************************************************
   { from http_config.inc }
   { from http_config.inc }
 
 

+ 3 - 3
packages/httpd24/src/util_filter.inc

@@ -135,15 +135,15 @@ type
  * @
  * @
   }
   }
   ap_out_filter_func = function (f: Pap_filter_t;
   ap_out_filter_func = function (f: Pap_filter_t;
-                                 b: Papr_bucket_brigade):apr_status_t;
+                                 b: Papr_bucket_brigade):apr_status_t; cdecl;
 
 
   ap_in_filter_func = function (f: Pap_filter_t; 
   ap_in_filter_func = function (f: Pap_filter_t; 
                                 b: Papr_bucket_brigade;
                                 b: Papr_bucket_brigade;
                                 mode: ap_input_mode_t;
                                 mode: ap_input_mode_t;
                                 block: apr_read_type_e;
                                 block: apr_read_type_e;
-                                readbytes: apr_off_t): apr_status_t;
+                                readbytes: apr_off_t): apr_status_t; cdecl;
 
 
-  ap_init_filter_func = function (f: Pap_filter_t): Longint;
+  ap_init_filter_func = function (f: Pap_filter_t): Longint; cdecl;
 
 
   Pap_filter_func = ^ap_filter_func;
   Pap_filter_func = ^ap_filter_func;
   ap_filter_func = record
   ap_filter_func = record