ekg2
|
00001 /* 00002 * (C) Copyright 2004-2005 Michal 'GiM' Spadlinski <gim at skrzynka dot pl> 00003 * 00004 * This program is free software; you can redistribute it and/or modify 00005 * it under the terms of the GNU General Public License Version 2 as 00006 * published by the Free Software Foundation. 00007 * 00008 * This program is distributed in the hope that it will be useful, 00009 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00010 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00011 * GNU General Public License for more details. 00012 * 00013 * You should have received a copy of the GNU General Public License 00014 * along with this program; if not, write to the Free Software 00015 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00016 */ 00017 00018 #ifndef __EKG_PLUGINS_IRC_MISC_H 00019 #define __EKG_PLUGINS_IRC_MISC_H 00020 00021 #include <stdio.h> 00022 00023 #include <ekg/plugins.h> 00024 #include <ekg/sessions.h> 00025 00026 #include "irc.h" 00027 00028 #define IRC_COMMAND(x) static int x(session_t *s, irc_private_t *j, int fd, int ecode, char **param) 00029 typedef int (*Irc_Cmd) (session_t * , irc_private_t * , int , int , char **); 00030 00031 #define IRC_LISTBAN 0x001 00032 #define IRC_LISTEXC 0x002 00033 #define IRC_LISTINV 0x004 00034 #define IRC_LISTLIN 0x008 00035 #define IRC_LISTSTA 0x010 00036 #define IRC_LISTWHO 0x020 00037 #define IRC_LISTCHA 0x040 00038 #define IRC_LISTEND 0x080 00039 00040 #define IRC_WHOIS 0x001 00041 #define IRC_WHOWAS 0x002 00042 #define IRC_WHOERR 0x004 00043 00044 enum { IRC_ERR_12=0, IRC_ERR_21, IRC_ERR_ONLY1, IRC_ERR_NEW, IRC_ERR_IGNO, 00045 IRC_ERR_OTHER, 00046 00047 IRC_RPL_12=256, IRC_RPL_21, IRC_RPL_ONLY1, IRC_RPL_NEW, IRC_RPL_IGNO, 00048 IRC_RPL_OTHER }; 00049 00050 typedef struct { 00051 int type; 00052 int num; 00053 const char *comm; 00054 const char *name; 00055 Irc_Cmd handler; 00056 int future; 00057 } IrcCommand; 00058 00059 IRC_COMMAND(irc_c_init); 00060 IRC_COMMAND(irc_c_invite); 00061 IRC_COMMAND(irc_c_ping); 00062 IRC_COMMAND(irc_c_nick); 00063 IRC_COMMAND(irc_c_msg); 00064 IRC_COMMAND(irc_c_join); 00065 IRC_COMMAND(irc_c_part); 00066 IRC_COMMAND(irc_c_kick); 00067 IRC_COMMAND(irc_c_quit); 00068 IRC_COMMAND(irc_c_error); 00069 IRC_COMMAND(irc_c_list); 00070 IRC_COMMAND(irc_c_namerpl); 00071 IRC_COMMAND(irc_c_mode); 00072 IRC_COMMAND(irc_c_topic); 00073 IRC_COMMAND(irc_c_whois); 00074 00075 /* 1st - 1 if reply in numeric form, 0 if as a string 00076 * 1st== 1 | 0 00077 * 2nd - code | 0 00078 * 3rd - NULL | command 00079 * 4th - name from rfc and stylename | command name 00080 * 5th - function handler | function handler 00081 * 6th - 0 or one of enum's above... 00082 * IRC_ERR if error, IRC_RPL if reply [used to determine style 00083 * of display] 00084 * 00085 * for simple numeric replies [and for ERROR] exsist one function 00086 * irc_c_error 00087 * 00088 * first it checks style and if =NOT= *_OTHER or *_IGNO [ignore] 00089 * it displays some information 00090 * if *_OTHER is used reply is treated according to its code 00091 * starting with line switch(i), where i is code 00092 * 00093 * if you add something that is not currently on the list 00094 * give somewhere [*] in comment 00095 */ 00096 static const IrcCommand irccommands[] = 00097 { 00098 { 1, -1, NULL, NULL, &irc_c_error, IRC_ERR_NEW }, 00099 { 1, 1, NULL, "RPL_WELCOME", &irc_c_init, 0 }, 00100 { 1, 2, NULL, "RPL_YOURHOST", &irc_c_init, 0 }, 00101 { 1, 3, NULL, "RPL_CREATED", &irc_c_init, 0 }, 00102 { 1, 4, NULL, "RPL_MYINFO", &irc_c_init, 0 }, 00103 { 1, 5, NULL, "RPL_BOUNCE", &irc_c_init, 0 }, 00104 00105 /* { 1, 200, NULL, "RPL_TRACELINK", &irc_c_error, 00106 { 1, 201, NULL, "RPL_TRACECONNECTING", &irc_c_error, 00107 { 1, 202, NULL, "RPL_TRACEHANDSHAKE", &irc_c_error, 00108 { 1, 203, NULL, "RPL_TRACEUNKNOWN", &irc_c_error, 00109 { 1, 204, NULL, "RPL_TRACEOPERATOR", &irc_c_error, 00110 { 1, 205, NULL, "RPL_TRACEUSER", &irc_c_error, 00111 { 1, 206, NULL, "RPL_TRACESERVER", &irc_c_error, 00112 { 1, 207, NULL, "RPL_TRACESERVICE", &irc_c_error, 00113 { 1, 208, NULL, "RPL_TRACENEWTYPE", &irc_c_error, 00114 { 1, 209, NULL, "RPL_TRACECLASS", &irc_c_error, 00115 { 1, 210, NULL, "RPL_TRACERECONNECT", &irc_c_error, 00116 { 1, 261, NULL, "RPL_TRACELOG", &irc_c_error, 00117 { 1, 262, NULL, "RPL_TRACEEND", &irc_c_error, */ 00118 00119 /* { 1, 211, NULL, "RPL_STATSLINKINFO", &irc_c_error, 00120 { 1, 212, NULL, "RPL_STATSCOMMANDS", &irc_c_error, 00121 { 1, 219, NULL, "RPL_ENDOFSTATS", &irc_c_error, 00122 { 1, 242, NULL, "RPL_STATSUPTIME", &irc_c_error, 00123 { 1, 243, NULL, "RPL_STATSOLINE", &irc_c_error, */ 00124 /*[ ] /stats M -> modules */ 00125 { 1, 212, NULL, "RPL_STATS", &irc_c_list, IRC_LISTSTA}, 00126 /*[*] /stats C -> connect() */ 00127 { 1, 213, NULL, "RPL_STATS_EXT", &irc_c_list, IRC_LISTSTA}, 00128 /*[*] /stats I -> I:lines */ 00129 { 1, 215, NULL, "RPL_STATS_EXT", &irc_c_list, IRC_LISTSTA}, 00130 /*[*] /stats K -> K:lines */ 00131 { 1, 216, NULL, "RPL_STATS_EXT", &irc_c_list, IRC_LISTSTA}, 00132 /*[*] /stats Y -> classes */ 00133 { 1, 218, NULL, "RPL_STATS", &irc_c_list, IRC_LISTSTA}, 00134 { 1, 219, NULL, "RPL_STATSEND", &irc_c_list, IRC_LISTSTA|IRC_LISTEND }, 00135 /*[*] /stats P -> ports */ 00136 { 1, 220, NULL, "RPL_STATS_EXT", &irc_c_list, IRC_LISTSTA}, 00137 /*[*] /stats A */ 00138 { 1, 226, NULL, "RPL_STATS", &irc_c_list, IRC_LISTSTA}, 00139 /*[ ] /stats u -> uptime */ 00140 { 1, 242, NULL, "RPL_STATS", &irc_c_list, IRC_LISTSTA}, 00141 /*[ ] /stats O -> O:lines ; P -> aktywni */ 00142 { 1, 243, NULL, "RPL_STATS_EXT", &irc_c_list, IRC_LISTSTA}, 00143 /*[*] /stats H -> */ 00144 { 1, 244, NULL, "RPL_STATS", &irc_c_list, IRC_LISTSTA}, 00145 /*[*] /stats F, R, T, Z, ? */ 00146 { 1, 249, NULL, "RPL_STATS", &irc_c_list, IRC_LISTSTA}, 00147 00148 /* { 1, 221, NULL, "RPL_UMODEIS", &irc_c_error, 00149 { 1, 234, NULL, "RPL_SERVLIST", &irc_c_error, 00150 { 1, 235, NULL, "RPL_SERVLISTEND", &irc_c_error, 00151 00152 { 1,250,NULL,"RPL_STATS",&irc_c_list,IRC_LISTSTA }, [*] 00153 { 1, 251, NULL, "RPL_LUSERCLIENT", &irc_c_error, 00154 { 1, 252, NULL, "RPL_LUSEROP", &irc_c_error, 00155 { 1, 253, NULL, "RPL_LUSERUNKNOWN", &irc_c_error, 00156 { 1, 254, NULL, "RPL_LUSERCHANNELS", &irc_c_error, 00157 { 1, 255, NULL, "RPL_LUSERME", &irc_c_error, 00158 */ 00159 00160 /* 00161 { 1, 256, NULL, "RPL_ADMINME", &irc_c_error, 00162 { 1, 257, NULL, "RPL_ADMINLOC1", &irc_c_error, 00163 { 1, 258, NULL, "RPL_ADMINLOC2", &irc_c_error, 00164 { 1, 259, NULL, "RPL_ADMINEMAIL", &irc_c_error, */ 00165 { 1, 263, NULL, "RPL_TRYAGAIN", &irc_c_error, IRC_ERR_ONLY1}, 00166 00167 /* { 1, 302, NULL, "RPL_USERHOST", &irc_c_error, 00168 { 1, 303, NULL, "RPL_ISON", &irc_c_error, */ 00169 00170 { 1, 301, NULL, "RPL_AWAY", &irc_c_error, IRC_RPL_OTHER}, 00171 { 1, 305, NULL, "RPL_UNAWAY", &irc_c_error, IRC_RPL_ONLY1}, 00172 { 1, 306, NULL, "RPL_NOWAWAY", &irc_c_error, IRC_RPL_ONLY1}, 00173 00174 { 1, 311, NULL, "RPL_WHOISUSER", &irc_c_whois,IRC_WHOIS}, 00175 { 1, 312, NULL, "RPL_WHOISSERVER", &irc_c_whois,IRC_WHOIS}, 00176 { 1, 313, NULL, "RPL_WHOISOPERATOR", &irc_c_whois,IRC_WHOIS}, 00177 { 1, 317, NULL, "RPL_WHOISIDLE", &irc_c_whois,IRC_WHOIS}, 00178 { 1, 318, NULL, "RPL_ENDOFWHOIS", &irc_c_whois,IRC_WHOIS}, 00179 { 1, 319, NULL, "RPL_WHOISCHANNELS", &irc_c_whois,IRC_WHOIS}, 00180 { 1, 320, NULL, "RPL_WHOISMISC", &irc_c_whois,IRC_WHOIS}, 00181 { 1, 314, NULL, "RPL_WHOWASUSER", &irc_c_whois,IRC_WHOWAS}, 00182 { 1, 369, NULL, "RPL_ENDOFWHOWAS", &irc_c_whois,IRC_WHOWAS}, 00183 00184 /* G->dj I want to keep the names from rfc2812 */ 00185 { 1, 315, NULL, "RPL_ENDOFWHO", &irc_c_list, IRC_LISTWHO|IRC_LISTEND }, 00186 { 1, 352, NULL, "RPL_WHOREPLY", &irc_c_list, IRC_LISTWHO }, 00187 00188 /* G->dj: with what it colides ?? */ 00189 /* { 1, 321, NULL, "RPL_LISTSTART", &irc_c_error, */ 00190 { 1, 321, NULL, "RPL_CHLISTSTART", &irc_c_list, IRC_LISTCHA }, 00191 { 1, 322, NULL, "RPL_LIST", &irc_c_list, IRC_LISTCHA }, 00192 { 1, 323, NULL, "RPL_LISTEND", &irc_c_list, IRC_LISTCHA|IRC_LISTEND }, 00193 00194 /* { 1, 325, NULL, "RPL_UNIQOPIS", &irc_c_error, */ 00195 { 1, 324, NULL, "RPL_CHANNELMODEIS", &irc_c_mode, IRC_RPL_OTHER}, 00196 /* 331 is really RPL_NOTOPIC, but I don't want another format... */ 00197 { 1, 331, NULL, "RPL_TOPIC", &irc_c_error, IRC_RPL_OTHER}, 00198 { 1, 332, NULL, "RPL_TOPIC", &irc_c_error, IRC_RPL_OTHER}, 00199 /* [*] 333 not in rfc 2812 */ 00200 { 1, 333, NULL, "RPL_TOPICBY", &irc_c_error, IRC_RPL_OTHER}, 00201 { 1, 341, NULL, "RPL_INVITE", &irc_c_error, IRC_RPL_OTHER}, 00202 /* { 1, 443, G->dj: ??? */ 00203 /* { 1, 351, NULL, "RPL_VERSION", &irc_c_error, */ 00204 { 1, 353, NULL, "RPL_NAMREPLY", &irc_c_namerpl, 0 }, 00205 { 1, 364, NULL, "RPL_LINKS", &irc_c_list, IRC_LISTLIN }, 00206 { 1, 365, NULL, "RPL_ENDOFLINKS", &irc_c_list, IRC_LISTLIN|IRC_LISTEND }, 00207 00208 { 1, 346, NULL, "RPL_INVITELIST", &irc_c_list, IRC_LISTINV }, 00209 { 1, 347, NULL, "RPL_ENDOFLIST", &irc_c_list, IRC_LISTINV|IRC_LISTEND }, 00210 { 1, 348, NULL, "RPL_EXCEPTLIST", &irc_c_list, IRC_LISTEXC }, 00211 { 1, 349, NULL, "RPL_ENDOFLIST", &irc_c_list, IRC_LISTEXC|IRC_LISTEND }, 00212 00213 { 1, 366, NULL, "RPL_ENDOFNAMES", &irc_c_error, IRC_RPL_IGNO}, 00214 { 1, 367, NULL, "RPL_BANLIST", &irc_c_list, IRC_LISTBAN }, 00215 { 1, 368, NULL, "RPL_ENDOFBANLIST", &irc_c_list, IRC_LISTBAN|IRC_LISTEND }, 00216 /* { 1, 371, NULL, "RPL_INFO", &irc_c_error, */ 00217 { 1, 372, NULL, "RPL_MOTD", &irc_c_error, IRC_RPL_OTHER}, 00218 /* { 1, 374, NULL, "RPL_ENDOFINFO", &irc_c_error, */ 00219 { 1, 375, NULL, "RPL_MOTDSTART", &irc_c_error, IRC_RPL_OTHER}, 00220 { 1, 376, NULL, "RPL_ENDOFMOTD", &irc_c_error, IRC_RPL_OTHER}, 00221 /* { 1, 381, NULL, "RPL_YOUREOPER", &irc_c_error, 00222 { 1, 382, NULL, "RPL_REHASHING", &irc_c_error, 00223 { 1, 383, NULL, "RPL_YOURESERVICE", &irc_c_error, 00224 { 1, 391, NULL, "RPL_TIME", &irc_c_error, 00225 { 1, 392, NULL, "RPL_USERSSTART", &irc_c_error, 00226 { 1, 393, NULL, "RPL_USERS", &irc_c_error, 00227 { 1, 394, NULL, "RPL_ENDOFUSERS", &irc_c_error, 00228 { 1, 395, NULL, "RPL_NOUSERS", &irc_c_error, */ 00229 00230 { 1, 401, NULL, "ERR_NOSUCHNICK", &irc_c_error, IRC_ERR_21 }, 00231 { 1, 402, NULL, "ERR_NOSUCHSERVER", &irc_c_error, IRC_ERR_21 }, 00232 { 1, 403, NULL, "ERR_NOSUCHCHANNEL", &irc_c_error, IRC_ERR_21 }, 00233 /* 00234 * G->dj: what ? why dya want to put this stuff there ? 00235 + { 1, 401, NULL, "ERR_NOSUCHNICK", &irc_c_whois, IRC_WHOIS | IRC_WHOERR }, 00236 + { 1, 402, NULL, "ERR_NOSUCHSERVER", &irc_c_whois, IRC_WHOIS | IRC_WHOERR }, 00237 + { 1, 403, NULL, "ERR_NOSUCHCHANNEL", &irc_c_whois, IRC_WHOIS | IRC_WHOERR }, 00238 + { 1, 406, NULL, "ERR_WASNOSUCHNICK", &irc_c_whois, IRC_WHOWAS | IRC_WHOERR }, 00239 + 00240 */ 00241 { 1, 404, NULL, "ERR_CANNOTSENDTOCHAN", &irc_c_error, IRC_ERR_OTHER }, 00242 { 1, 404, NULL, "ERR_CANNOTSENDTOCHAN", &irc_c_error, IRC_ERR_OTHER }, 00243 { 1, 405, NULL, "ERR_TOOMANYCHANNELS", &irc_c_error, IRC_ERR_12 }, 00244 { 1, 406, NULL, "ERR_WASNOSUCHNICK", &irc_c_error, IRC_ERR_21 }, 00245 { 1, 407, NULL, "ERR_TOOMANYTARGETS", &irc_c_error, IRC_ERR_12 }, 00246 { 1, 408, NULL, "ERR_NOSUCHSERVICE", &irc_c_error, IRC_ERR_21 }, 00247 { 1, 409, NULL, "ERR_NOORIGIN", &irc_c_error, IRC_ERR_ONLY1 }, 00248 { 1, 411, NULL, "ERR_NORECIPIENT", &irc_c_error, IRC_ERR_ONLY1 }, 00249 { 1, 412, NULL, "ERR_NOTEXTTOSEND", &irc_c_error, IRC_ERR_ONLY1 }, 00250 { 1, 413, NULL, "ERR_NOTOPLEVEL", &irc_c_error, IRC_ERR_21 }, 00251 { 1, 414, NULL, "ERR_WILDTOPLEVEL", &irc_c_error, IRC_ERR_21 }, 00252 { 1, 415, NULL, "ERR_BADMASK", &irc_c_error, IRC_ERR_21 }, 00253 { 1, 421, NULL, "ERR_UNKNOWNCOMMAND", &irc_c_error, IRC_ERR_21 }, 00254 { 1, 422, NULL, "ERR_NOMOTD", &irc_c_error, IRC_ERR_ONLY1 }, 00255 { 1, 423, NULL, "ERR_NOADMININFO", &irc_c_error, IRC_ERR_12 }, 00256 { 1, 424, NULL, "ERR_FILEERROR", &irc_c_error, IRC_ERR_ONLY1 }, 00257 { 1, 431, NULL, "ERR_NONICKNAMEGIVEN", &irc_c_error, IRC_ERR_ONLY1 }, 00258 { 1, 432, NULL, "ERR_ERRONEUSNICKNAME", &irc_c_error, IRC_ERR_21 }, 00259 { 1, 433, NULL, "ERR_NICKNAMEINUSE", &irc_c_error, IRC_ERR_OTHER }, 00260 { 1, 436, NULL, "ERR_NICKCOLLISION", &irc_c_error, IRC_ERR_12 }, 00261 { 1, 437, NULL, "ERR_UNAVAILRESOURCE", &irc_c_error, IRC_ERR_12 }, 00262 { 1, 441, NULL, "ERR_USERNOTINCHANNEL", &irc_c_error, IRC_ERR_NEW }, 00263 { 1, 442, NULL, "ERR_NOTONCHANNEL", &irc_c_error, IRC_ERR_21 }, 00264 { 1, 443, NULL, "ERR_USERONCHANNEL", &irc_c_error, IRC_ERR_NEW }, 00265 { 1, 444, NULL, "ERR_NOLOGIN", &irc_c_error, IRC_ERR_12 }, 00266 { 1, 445, NULL, "ERR_SUMMONDISABLED", &irc_c_error, IRC_ERR_ONLY1 }, 00267 { 1, 446, NULL, "ERR_USERSDISABLED", &irc_c_error, IRC_ERR_ONLY1 }, 00268 { 1, 451, NULL, "ERR_NOTREGISTERED", &irc_c_error, IRC_ERR_ONLY1 }, 00269 { 1, 461, NULL, "ERR_NEEDMOREPARAMS", &irc_c_error, IRC_ERR_12 }, 00270 { 1, 462, NULL, "ERR_ALREADYREGISTRED", &irc_c_error, IRC_ERR_ONLY1 }, 00271 { 1, 463, NULL, "ERR_NOPERMFORHOST", &irc_c_error, IRC_ERR_ONLY1 }, 00272 { 1, 464, NULL, "ERR_PASSWDMISMATCH", &irc_c_error, IRC_ERR_ONLY1 }, 00273 { 1, 465, NULL, "ERR_YOUREBANNEDCREEP", &irc_c_error, IRC_ERR_ONLY1 }, 00274 { 1, 466, NULL, "ERR_YOUWILLBEBANNED", &irc_c_error, IRC_ERR_NEW }, 00275 { 1, 467, NULL, "ERR_KEYSET", &irc_c_error, IRC_ERR_12 }, 00276 { 1, 471, NULL, "ERR_CHANNELISFULL", &irc_c_error, IRC_ERR_12 }, 00277 { 1, 472, NULL, "ERR_UNKNOWNMODE", &irc_c_error, IRC_ERR_12 }, 00278 { 1, 473, NULL, "ERR_INVITEONLYCHAN", &irc_c_error, IRC_ERR_12 }, 00279 { 1, 474, NULL, "ERR_BANNEDFROMCHAN", &irc_c_error, IRC_ERR_12 }, 00280 { 1, 475, NULL, "ERR_BADCHANNELKEY", &irc_c_error, IRC_ERR_12 }, 00281 { 1, 476, NULL, "ERR_BADCHANMASK", &irc_c_error, IRC_ERR_12 }, 00282 { 1, 477, NULL, "ERR_NOCHANMODES", &irc_c_error, IRC_ERR_12 }, 00283 { 1, 478, NULL, "ERR_BANLISTFULL", &irc_c_error, IRC_ERR_NEW }, 00284 { 1, 481, NULL, "ERR_NOPRIVILEGES", &irc_c_error, IRC_ERR_ONLY1 }, 00285 { 1, 482, NULL, "ERR_CHANOPRIVSNEEDED", &irc_c_error, IRC_ERR_12 }, 00286 { 1, 483, NULL, "ERR_CANTKILLSERVER", &irc_c_error, IRC_ERR_ONLY1 }, 00287 { 1, 484, NULL, "ERR_RESTRICTED", &irc_c_error, IRC_ERR_ONLY1 }, 00288 { 1, 485, NULL, "ERR_UNIQOPPRIVSNEEDED",&irc_c_error, IRC_ERR_ONLY1 }, 00289 { 1, 491, NULL, "ERR_NOOPERHOST", &irc_c_error, IRC_ERR_ONLY1 }, 00290 { 1, 501, NULL, "ERR_UMODEUNKNOWNFLAG", &irc_c_error, IRC_ERR_ONLY1 }, 00291 { 1, 502, NULL, "ERR_USERSDONTMATCH", &irc_c_error, IRC_ERR_ONLY1 }, 00292 00293 { 0, 0, "PING", "PING", &irc_c_ping, 0 }, 00294 { 0, 0, "INVITE", "INVITE", &irc_c_invite, 0 }, 00295 { 0, 0, "NICK", "NICK", &irc_c_nick, 0 }, 00296 { 0, 0, "PRIVMSG", "PRIVMSG", &irc_c_msg, 0 }, 00297 { 0, 0, "NOTICE", "NOTICE", &irc_c_msg, 0 }, 00298 { 0, 0, "JOIN", "JOIN", &irc_c_join, 0 }, 00299 { 0, 0, "PART", "PART", &irc_c_part, 0 }, 00300 { 0, 0, "KICK", "KICK", &irc_c_kick, 0 }, 00301 { 0, 0, "QUIT", "QUIT", &irc_c_quit, 0 }, 00302 { 0, 0, "MODE", "MODE", &irc_c_mode, 0 }, 00303 { 0, 0, "TOPIC", "TOPIC", &irc_c_topic, 0 }, 00304 { 0, 0, "ERROR", "ERROR", &irc_c_error, 0 }, 00305 { -1, -1, NULL, NULL, NULL, 0 } 00306 }; 00307 /* 00308 { 1, 372, "RPL_MOTD", irc_c_motd, 1, NULL }, 00309 { 1, 376, "RPL_ENDOFMOTD", irc_c_motd, 1, NULL } 00310 */ 00311 #endif /* __EKG_PLUGINS_IRC_MISC_H */ 00312 00313 /* 00314 * Local Variables: 00315 * mode: c 00316 * c-file-style: "k&r" 00317 * c-basic-offset: 8 00318 * indent-tabs-mode: t 00319 * End: 00320 */