⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch21.htm

📁 CGI programming is the hottest stuff to look out for in this book
💻 HTM
📖 第 1 页 / 共 5 页
字号:
&nbsp;&nbsp;&nbsp;&nbsp;l = link_date;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&lt;H2&gt;By Date&lt;/H2&gt;\n&quot;);
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&lt;ul&gt;\n&quot;);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;for(;l;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;if( l-&gt;data )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;printf(&quot;&lt;li&gt;
&lt;B&gt;%s :&lt;/B&gt; %d\n&quot;, ((sDATE *) (l-&gt;data))-&gt;date,
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((sDATE
*) (l-&gt;data))-&gt;num_access );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l
= l-&gt;next;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;break;
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&lt;/ul&gt;\n&quot;);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;l = link_hour;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&lt;H2&gt;By Hour&lt;/H2&gt;\n&quot;);
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&lt;ul&gt;\n&quot;);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;for(;l;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;if( l-&gt;data )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;printf(&quot;&lt;li&gt;
&lt;B&gt;%s :&lt;/B&gt; %d\n&quot;, ((sHOUR *) (l-&gt;data))-&gt;hour,
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((sHOUR
*) (l-&gt;data))-&gt;num_access );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l
= l-&gt;next;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;break;
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&lt;/ul&gt;\n&quot;);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;l = link_hostname;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&lt;H2&gt;By Hostname&lt;/H2&gt;\n&quot;);
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&lt;ul&gt;\n&quot;);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;for(;l;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;if( l-&gt;data )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;printf(&quot;&lt;li&gt;
&lt;B&gt;%s :&lt;/B&gt; %d\n&quot;, ((sHOSTNAME *) (l-&gt;data))-&gt;hostname,
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((sHOSTNAME
*) (l-&gt;data))-&gt;num_access );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l
= l-&gt;next;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;break;
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&lt;/ul&gt;\n&quot;);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;l = link_filename;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&lt;H2&gt;By Filename&lt;/H2&gt;\n&quot;);
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&lt;ul&gt;\n&quot;);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;for(;l;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;if( l-&gt;data )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;printf(&quot;&lt;li&gt;
&lt;B&gt;%s :&lt;/B&gt; %d\n&quot;, ((sFILENAME *) (l-&gt;data))-&gt;filename,
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((sFILENAME
*) (l-&gt;data))-&gt;num_access );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l
= l-&gt;next;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;break;
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&lt;/ul&gt;\n&quot;)</FONT></TT>;
<BR>
<TT><FONT FACE="Courier">}</FONT></TT>
</BLOCKQUOTE>
<HR>
<P>
This program makes use of linked lists, which aren't supported
directly in C as associative arrays are in Perl. Thus, there are
some support routines that are needed in order to make the program
function properly, and they are included here, in Listings 21.2
and 21.3.
<HR>
<BLOCKQUOTE>
<B>Listing 21.2. The linked list routine.<BR>
</B>
</BLOCKQUOTE>
<BLOCKQUOTE>
<TT><FONT FACE="Courier">// linklist.h&nbsp;&nbsp;-- The Header
file for the Linked List Routines<BR>
// Available on-line at http://www.anadas.com/cgiunleashed/trackuser/
<BR>
//<BR>
// By Shuman Ghosemajumder, Anadas Software Development<BR>
<BR>
// STRUCTURES *********************************************************
<BR>
<BR>
typedef struct linked_list<BR>
{&nbsp;&nbsp;&nbsp;struct linked_list * next;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;void * data;<BR>
} sLINK;<BR>
<BR>
// LINKED LIST FUncTION PROTOTYPES ************************************
<BR>
<BR>
void InitHead( sLINK * * head );<BR>
void DestroyList( sLINK * * head );<BR>
int CountNodes( sLINK * head );<BR>
sLINK * GetNext( sLINK * l );<BR>
sLINK * AddNode( sLINK * head, void * data, int data_size )</FONT></TT>;
<BR>
<TT><FONT FACE="Courier">sLINK * FindNode( sLINK * head, void
* data, int offset, int data_size );</FONT></TT>
</BLOCKQUOTE>
<HR>
<HR>
<BLOCKQUOTE>
<B>Listing 21.3. Source code for the linked list functions.<BR>
</B>
</BLOCKQUOTE>
<BLOCKQUOTE>
<TT><FONT FACE="Courier">// linklist.cpp -- Linked List Functions
<BR>
// Available on-line at http://www.anadas.com/cgiunleashed/trackuser/
<BR>
//<BR>
// By Shuman Ghosemajumder, Anadas Software Development<BR>
<BR>
<BR>
void InitHead( sLINK * * head )<BR>
{<BR>
&nbsp;&nbsp;&nbsp;&nbsp;// Initialize the head pointer of a linked
list<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;*head = (sLINK *) malloc( sizeof(sLINK)
);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// allocate memory<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;if( ! *head )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;printf(&quot;Memory
allocation error.\n&quot;);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;(*head)-&gt;data = NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//
no data yet<BR>
&nbsp;&nbsp;&nbsp;&nbsp;(*head)-&gt;next = NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//
no next pointer yet<BR>
}<BR>
<BR>
<BR>
void DestroyList( sLINK * * head )<BR>
{<BR>
&nbsp;&nbsp;&nbsp;&nbsp;// Destroy an entire linked list<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;sLINK * l = *head;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;sLINK * temp;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;for(;;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb
sp;&nbsp;&nbsp;
// loop to destroy<BR>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;if( l-&gt;data )&nbsp;&nbsp;&nbsp;free(
l-&gt;data );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//
each node of the list<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( l-&gt;next
)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;temp
= l;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l
= l-&gt;next;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(
temp );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//
thus freeing memory<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;break;
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;*head = NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// destroy the head pointer<BR>
}<BR>
<BR>
<BR>
sLINK * AddNode( sLINK * head, void * data, int data_size )<BR>
{<BR>
&nbsp;&nbsp;&nbsp;&nbsp;// Add a node to the linked list<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;sLINK * next = head;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;sLINK * last;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;do<BR>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;last = next;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next = GetNext(
next );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;while( next );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//
go to the end of the list<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;// next == NULL, therefore last == the
last node<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;if( last-&gt;data == NULL )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;next = last;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
&nbsp;&nbsp;&nbsp;&nbsp;else<BR>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;next = (sLINK *) malloc(
sizeof(sLINK) );<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( ! next )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;printf(&quot;Memory
allocation error.\n&quot;);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last-&gt;next
= next;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;next-&gt;data = (void *) malloc( data_size
);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;if( ! next-&gt;data )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;printf(&quot;Memory
allocation error.\n&quot;);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;memcpy( next-&gt;data, data, data_size
);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;next-&gt;next = NULL;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;return ((sLINK *) next);<BR>
}<BR>
<BR>
int CountNodes( sLINK * head )<BR>
{<BR>
&nbsp;&nbsp;&nbsp;&nbsp;// Return the total number of nodes in
the linked list<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;int count = 0;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;do<BR>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;head = GetNext( head
);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;while( head );<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;return count;<BR>
}<BR>
<BR>
sLINK * GetNext( sLINK * l )<BR>
{<BR>
&nbsp;&nbsp;&nbsp;&nbsp;// Given one node of the list, return
a pointer to the next node if it<BR>
&nbsp;&nbsp;&nbsp;&nbsp;// exists, or NULL if it doesn't.<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;if( l-&gt;next != NULL ) return ((sLINK
*) l-&gt;next);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
NULL;<BR>
}<BR>
<BR>
<BR>
sLINK * FindNode( sLINK * head, void * data, int offset, int data_size
)<BR>
{<BR>
&nbsp;&nbsp;&nbsp;&nbsp;// Compare &quot;data&quot; to the value
at &quot;offset&quot; in the data structure portion<BR>
&nbsp;&nbsp;&nbsp;&nbsp;// of the linked list, and return a pointer
to the node which contains<BR>
&nbsp;&nbsp;&nbsp;&nbsp;// this value if there is one.<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;for(;;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;if( head-&gt;data !=
NULL )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;if(
memcmp( (char *) head-&gt;data + offset, (char *) data, data_size
) == &Acirc;0 )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;return
( (sLINK *) head );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(
head-&gt;next )&nbsp;&nbsp;&nbsp;&nbsp;head = head-&gt;next;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
NULL;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;return
NULL;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
}</FONT></TT>
</BLOCKQUOTE>
<HR>
<P>
This program is a good starting point, but ideally you'd like
to be able to have it compiled automatically. As mentioned before,
access logs are often several megabytes (some can be several <I>hundred</I>
megabytes!) in size, so the idea of generating these kinds of

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -