Make the packet count an unsigned value, as frame numbers are unsigned.
[obnox/wireshark/wip.git] / cfile.c
1 /* cfile.c
2  * capture_file GUI-independent manipulation
3  * Vassilii Khachaturov <vassilii@tarunz.org>
4  *
5  * $Id$
6  *
7  * Wireshark - Network traffic analyzer
8  * By Gerald Combs <gerald@wireshark.org>
9  * Copyright 1998 Gerald Combs
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24  */
25
26 #ifdef HAVE_CONFIG_H
27 # include "config.h"
28 #endif
29
30 #include <glib.h>
31
32 #include <epan/packet.h>
33
34 #include "cfile.h"
35
36 void
37 cap_file_init(capture_file *cf)
38 {
39   /* Initialize the capture file struct */
40   cf->plist_start    = NULL;
41   cf->plist_end      = NULL;
42   cf->wth            = NULL;
43   cf->filename       = NULL;
44   cf->source         = NULL;
45   cf->user_saved     = FALSE;
46   cf->is_tempfile    = FALSE;
47   cf->rfcode         = NULL;
48   cf->dfilter        = NULL;
49   cf->has_snap       = FALSE;
50   cf->snap           = WTAP_MAX_PACKET_SIZE;
51   cf->count          = 0;
52   cf->last_found_num = 0;
53   cf->last_found_fd  = NULL;
54   cf->redissecting   = FALSE;
55 }
56
57 void
58 cap_file_add_fdata(capture_file *cf, frame_data *fdata)
59 {
60   frame_data *plist_end = cf->plist_end;
61   fdata->prev = plist_end;
62   if (plist_end != NULL)
63     plist_end->next = fdata;
64   else
65     cf->plist_start = fdata;
66   cf->plist_end = fdata;
67 }
68
69 /*
70  * Find the frame_data for the specified frame number.
71  * Do some caching to make this work reasonably fast for
72  * forward and backward sequential passes through the packets.
73  */
74 frame_data *
75 cap_file_find_fdata(capture_file *cf, guint32 num)
76 {
77   frame_data *fdata;
78
79   if (num == 0) {
80     /* There is no frame number 0 */
81     return NULL;
82   }
83
84   /*
85    * Did we remember a frame number from a sequential pass through
86    * the frames?
87    */
88   if (cf->last_found_num != 0) {
89     /*
90      * Yes.  Is this that frame?
91      */
92     if (num == cf->last_found_num) {
93       /* Yes - return it. */
94       return cf->last_found_fd;
95     }
96
97     /*
98      * No.  Is it the frame just after that frame?
99      */
100     if (num == cf->last_found_num + 1) {
101       /*
102        * Yes - if there is such a frame, remember it and return it.
103        */
104       fdata = cf->last_found_fd->next;
105       if (fdata != NULL) {
106         cf->last_found_num = num;
107         cf->last_found_fd = fdata;
108       }
109       return fdata;     /* could be null, if there is no such frame */
110     }
111
112     /*
113      * No.  Is it the frame just before that frame?
114      */
115     if (num == cf->last_found_num - 1) {
116       /*
117        * Yes - if there is such a frame, remember it and return it.
118        */
119       fdata = cf->last_found_fd->prev;
120       if (fdata != NULL) {
121         cf->last_found_num = num;
122         cf->last_found_fd = fdata;
123       }
124       return fdata;     /* could be null, if there is no such frame */
125     }
126   }
127
128   for (fdata = cf->plist_start; fdata != NULL && fdata->num < num;
129        fdata = fdata->next)
130     ;
131   if (fdata != NULL) {
132     cf->last_found_num = num;
133     cf->last_found_fd = fdata;
134   }
135   return fdata;
136 }