src/getopt.h

Mon, 20 Jan 2003 09:10:23 +0000

author
Christian Hammond <chipx86@chipx86.com>
date
Mon, 20 Jan 2003 09:10:23 +0000
changeset 4359
cf899ee07d1d
parent 991
2f415c128b8e
child 8046
c581b20a47d6
permissions
-rw-r--r--

[gaim-migrate @ 4625]
Wow, okay, where to begin with this one ;)

I rewrote the whole conversation backend. It is now core/UI split. Here's
how it works..

Every conversation is represented by a gaim_conversation structure. This
branches out into gaim_im and gaim_chat structures. Every conversation
lives in (well, normally, but it doesn't have to) a gaim_window structure.
This is a _CORE_ representation of a window. There can be multiple
gaim_window structures around.

The gaim_window and gaim_conversation structures have UI-specific operation
structures associated with them. At the moment, the only UI is GTK+, and
this will be for some time. Don't start thinking you can write a QT UI now.
It's just not going to happen.

Everything that is done on a conversation is done through the core API.
This API does core processing and then calls the UI operations for the
rendering and anything else.

Now, what does this give the user?

- Multiple windows.
- Multiple tabs per window.
- Draggable tabs.
- Send As menu is moved to the menubar.
- Menubar for chats.
- Some very cool stuff in the future, like replacing, say, IRC chat windows
with an X-Chat interface, or whatever.
- Later on, customizable window/conversation positioning.

For developers:

- Fully documented API
- Core/UI split
- Variable checking and mostly sane handling of incorrect variables.
- Logical structure to conversations, both core and UI.
- Some very cool stuff in the future, like replacing, say, IRC chat windows
with an X-Chat interface, or whatever.
- Later on, customizable window/conversation positioning.
- Oh yeah, and the beginning of a stock icon system.

Now, there are things that aren't there yet. You will see tabs even if you
have them turned off. This will be fixed in time. Also, the preferences
will change to work with the new structure. I'm starting school in 2 days,
so it may not be done immediately, but hopefully in the next week.

Enjoy!

991
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
1 /* Declarations for getopt.
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
2 Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
3
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify it
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
5 under the terms of the GNU General Public License as published by the
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
6 Free Software Foundation; either version 2, or (at your option) any
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
7 later version.
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
8
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
12 GNU General Public License for more details.
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
13
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
15 along with this program; if not, write to the Free Software
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
16 Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
17
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
18 #ifndef _GETOPT_H
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
19 #define _GETOPT_H 1
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
20
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
21 #ifdef __cplusplus
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
22 extern "C" {
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
23 #endif
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
24
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
25 /* For communication from `getopt' to the caller.
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
26 When `getopt' finds an option that takes an argument,
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
27 the argument value is returned here.
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
28 Also, when `ordering' is RETURN_IN_ORDER,
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
29 each non-option ARGV-element is returned here. */
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
30
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
31 extern char *optarg;
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
32
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
33 /* Index in ARGV of the next element to be scanned.
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
34 This is used for communication to and from the caller
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
35 and for communication between successive calls to `getopt'.
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
36
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
37 On entry to `getopt', zero means this is the first call; initialize.
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
38
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
39 When `getopt' returns EOF, this is the index of the first of the
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
40 non-option elements that the caller should itself scan.
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
41
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
42 Otherwise, `optind' communicates from one call to the next
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
43 how much of ARGV has been scanned so far. */
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
44
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
45 extern int optind;
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
46
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
47 /* Callers store zero here to inhibit the error message `getopt' prints
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
48 for unrecognized options. */
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
49
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
50 extern int opterr;
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
51
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
52 /* Set to an option character which was unrecognized. */
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
53
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
54 extern int optopt;
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
55
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
56 /* Describe the long-named options requested by the application.
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
57 The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
58 of `struct option' terminated by an element containing a name which is
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
59 zero.
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
60
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
61 The field `has_arg' is:
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
62 no_argument (or 0) if the option does not take an argument,
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
63 required_argument (or 1) if the option requires an argument,
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
64 optional_argument (or 2) if the option takes an optional argument.
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
65
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
66 If the field `flag' is not NULL, it points to a variable that is set
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
67 to the value given in the field `val' when the option is found, but
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
68 left unchanged if the option is not found.
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
69
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
70 To have a long-named option do something other than set an `int' to
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
71 a compiled-in constant, such as set a value from `optarg', set the
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
72 option's `flag' field to zero and its `val' field to a nonzero
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
73 value (the equivalent single-letter option character, if there is
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
74 one). For long options that have a zero `flag' field, `getopt'
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
75 returns the contents of the `val' field. */
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
76
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
77 struct option
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
78 {
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
79 #if __STDC__
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
80 const char *name;
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
81 #else
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
82 char *name;
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
83 #endif
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
84 /* has_arg can't be an enum because some compilers complain about
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
85 type mismatches in all the code that assumes it is an int. */
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
86 int has_arg;
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
87 int *flag;
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
88 int val;
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
89 };
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
90
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
91 /* Names for the values of the `has_arg' field of `struct option'. */
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
92
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
93 #define no_argument 0
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
94 #define required_argument 1
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
95 #define optional_argument 2
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
96
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
97 #if __STDC__
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
98 #if defined(__GNU_LIBRARY__)
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
99 /* Many other libraries have conflicting prototypes for getopt, with
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
100 differences in the consts, in stdlib.h. To avoid compilation
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
101 errors, only prototype getopt for the GNU C library. */
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
102 extern int getopt (int argc, char *const *argv, const char *shortopts);
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
103 #else /* not __GNU_LIBRARY__ */
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
104 extern int getopt ();
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
105 #endif /* not __GNU_LIBRARY__ */
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
106 extern int getopt_long (int argc, char *const *argv, const char *shortopts,
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
107 const struct option *longopts, int *longind);
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
108 extern int getopt_long_only (int argc, char *const *argv,
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
109 const char *shortopts,
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
110 const struct option *longopts, int *longind);
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
111
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
112 /* Internal only. Users should not call this directly. */
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
113 extern int _getopt_internal (int argc, char *const *argv,
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
114 const char *shortopts,
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
115 const struct option *longopts, int *longind,
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
116 int long_only);
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
117 #else /* not __STDC__ */
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
118 extern int getopt ();
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
119 extern int getopt_long ();
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
120 extern int getopt_long_only ();
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
121
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
122 extern int _getopt_internal ();
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
123 #endif /* not __STDC__ */
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
124
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
125 #ifdef __cplusplus
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
126 }
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
127 #endif
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
128
2f415c128b8e [gaim-migrate @ 1001]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
diff changeset
129 #endif /* _GETOPT_H */

mercurial