Author: Bleep <tomh@inxpress.net>
[ircu2.10.12-pk.git] / ircd / s_err.c
index 96894158677f5d564345e1596ef9edfd6359e7fc..a9ba4cd7a5495098ff7f7526b57ff01e1d647395 100644 (file)
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id$
  */
-
-#include "sys.h"
-#include "h.h"
 #include "numeric.h"
-#include "s_err.h"
+#include "s_debug.h"
 #include "sprintf_irc.h"
 
-RCSTAG_CC("$Id$");
-
-typedef struct {
-  int num_val;
-  char *num_form;
-} Numeric;
-
-/* *INDENT-OFF* */
+#include <assert.h>
 
 static Numeric local_replies[] = {
 /* 000 */
-    {0, (char *)NULL},
+  { 0 },
 /* 001 */
-    {RPL_WELCOME, ":Welcome to the Internet Relay Network %s"},
+  { RPL_WELCOME, ":Welcome to the Internet Relay Network %s", "001" },
 /* 002 */
-    {RPL_YOURHOST, ":Your host is %s, running version %s"},
+  { RPL_YOURHOST, ":Your host is %s, running version %s", "002" },
 /* 003 */
-    {RPL_CREATED, ":This server was created %s"},
+  { RPL_CREATED, ":This server was created %s", "003" },
 /* 004 */
-    {RPL_MYINFO, "%s %s dioswkg biklmnopstv"},
+  { RPL_MYINFO, "%s %s dioswkg biklmnopstv", "004" },
 /* 005 */
-    {RPL_MAP, ":%s%s"},
+  { RPL_ISUPPORT, "%s :are supported by this server", "005" },
 /* 006 */
-    {RPL_MAPMORE, ":%s%s --> *more*"},
+  { 0 },
 /* 007 */
-    {RPL_MAPEND, ":End of /MAP"},
+  { 0 },
 /* 008 */
-    {RPL_SNOMASK, "%d :: Server notice mask (%#x)"},
+  { RPL_SNOMASK, "%d :: Server notice mask (%#x)", "008" },
 /* 009 */
-    {RPL_STATMEMTOT, "%u %u :Bytes Blocks"},
+  { RPL_STATMEMTOT, "%u %u :Bytes Blocks", "009" },
 /* 010 */
 #ifdef MEMSIZESTATS
-    {RPL_STATMEM, "%u %u %s %u"},
+  { RPL_STATMEM, "%u %u %s %u", "010" },
 #else
-    {RPL_STATMEM, "%u %u %s"},
+  { RPL_STATMEM, "%u %u %s", "010" },
 #endif
-    {0, (char *)NULL}
+/* 011 */
+  { 0 },
+/* 012 */
+  { 0 },
+/* 013 */
+  { 0 },
+/* 014 */
+  { 0 },
+/* 015 */
+  { RPL_MAP, ":%s%s:%s (%is) [%i clients]", "015" },
+/* 016 */
+  { RPL_MAPMORE, ":%s%s --> *more*", "016" },
+/* 017 */
+  { RPL_MAPEND, ":End of /MAP", "017" },
+  { 0 }
 };
 
 static Numeric numeric_errors[] = {
+/* 400 */
+  { ERR_FIRSTERROR, "", "400" },
 /* 401 */
-    {ERR_NOSUCHNICK, "%s :No such nick"},
+  { ERR_NOSUCHNICK, "%s :No such nick", "401" },
 /* 402 */
-    {ERR_NOSUCHSERVER, "%s :No such server"},
+  { ERR_NOSUCHSERVER, "%s :No such server", "402" },
 /* 403 */
-    {ERR_NOSUCHCHANNEL, "%s :No such channel"},
+  { ERR_NOSUCHCHANNEL, "%s :No such channel", "403" },
 /* 404 */
-    {ERR_CANNOTSENDTOCHAN, "%s :Cannot send to channel"},
+  { ERR_CANNOTSENDTOCHAN, "%s :Cannot send to channel", "404" },
 /* 405 */
-    {ERR_TOOMANYCHANNELS, "%s :You have joined too many channels"},
+  { ERR_TOOMANYCHANNELS, "%s :You have joined too many channels", "405" },
 /* 406 */
-    {ERR_WASNOSUCHNICK, "%s :There was no such nickname"},
+  { ERR_WASNOSUCHNICK, "%s :There was no such nickname", "406" },
 /* 407 */
-    {ERR_TOOMANYTARGETS, "%s :Duplicate recipients. No message delivered"},
+  { ERR_TOOMANYTARGETS, "%s :Duplicate recipients. No message delivered", "407" },
 /* 408 */
-    {0, (char *)NULL},
+  { 0 },
 /* 409 */
-    {ERR_NOORIGIN, ":No origin specified"},
+  { ERR_NOORIGIN, ":No origin specified", "409" },
 /* 410 */
-    {0, (char *)NULL},
+  { 0 },
 /* 411 */
-    {ERR_NORECIPIENT, ":No recipient given (%s)"},
+  { ERR_NORECIPIENT, ":No recipient given (%s)", "411" },
 /* 412 */
-    {ERR_NOTEXTTOSEND, ":No text to send"},
+  { ERR_NOTEXTTOSEND, ":No text to send", "412" },
 /* 413 */
-    {ERR_NOTOPLEVEL, "%s :No toplevel domain specified"},
+  { ERR_NOTOPLEVEL, "%s :No toplevel domain specified", "413" },
 /* 414 */
-    {ERR_WILDTOPLEVEL, "%s :Wildcard in toplevel Domain"},
+  { ERR_WILDTOPLEVEL, "%s :Wildcard in toplevel Domain", "414" },
 /* 415 */
-    {0, (char *)NULL},
+  { 0 },
 /* 416 */
-    {ERR_QUERYTOOLONG, "%s :Too many lines in the output, restrict your query"},
+  { ERR_QUERYTOOLONG, "%s :Too many lines in the output, restrict your query", "416" },
 /* 417 */
-    {0, (char *)NULL},
+  { 0 },
 /* 418 */
-    {0, (char *)NULL},
+  { 0 },
 /* 419 */
-    {0, (char *)NULL},
+  { 0 },
 /* 420 */
-    {0, (char *)NULL},
+  { 0 },
 /* 421 */
-    {ERR_UNKNOWNCOMMAND, "%s :Unknown command"},
+  { ERR_UNKNOWNCOMMAND, "%s :Unknown command", "421" },
 /* 422 */
-    {ERR_NOMOTD, ":MOTD File is missing"},
+  { ERR_NOMOTD, ":MOTD File is missing", "422" },
 /* 423 */
-    {ERR_NOADMININFO, "%s :No administrative info available"},
+  { ERR_NOADMININFO, "%s :No administrative info available", "423" },
 /* 424 */
-    {0, (char *)NULL},
+  { 0 },
 /* 425 */
-    {0, (char *)NULL},
+  { 0 },
 /* 426 */
-    {0, (char *)NULL},
+  { 0 },
 /* 427 */
-    {0, (char *)NULL},
+  { 0 },
 /* 428 */
-    {0, (char *)NULL},
+  { 0 },
 /* 429 */
-    {0, (char *)NULL},
+  { 0 },
 /* 430 */
-    {0, (char *)NULL},
+  { 0 },
 /* 431 */
-    {ERR_NONICKNAMEGIVEN, ":No nickname given"},
+  { ERR_NONICKNAMEGIVEN, ":No nickname given", "431" },
 /* 432 */
-    {ERR_ERRONEUSNICKNAME, "%s :Erroneus Nickname"},
+  { ERR_ERRONEUSNICKNAME, "%s :Erroneus Nickname", "432" },
 /* 433 */
-    {ERR_NICKNAMEINUSE, "%s :Nickname is already in use."},
+  { ERR_NICKNAMEINUSE, "%s :Nickname is already in use.", "433" },
 /* 434 */
-    {0, (char *)NULL},
+  { 0 },
 /* 435 */
-    {0, (char *)NULL},
+  { 0 },
 /* 436 */
-    {ERR_NICKCOLLISION, "%s :Nickname collision KILL"},
+  { ERR_NICKCOLLISION, "%s :Nickname collision KILL", "436" },
 /* 437 */
-    {ERR_BANNICKCHANGE, "%s :Cannot change nickname while banned on channel"},
+  { ERR_BANNICKCHANGE, "%s :Cannot change nickname while banned on channel", "437" },
 /* 438 */
-    {ERR_NICKTOOFAST, "%s :Nick change too fast. Please wait %d seconds."},
+  { ERR_NICKTOOFAST, "%s :Nick change too fast. Please wait %d seconds.", "438" },
 /* 439 */
-    {ERR_TARGETTOOFAST, "%s :Target change too fast. Please wait %d seconds."},
+  { ERR_TARGETTOOFAST, "%s :Target change too fast. Please wait %d seconds.", "439" },
 /* 440 */
-    {0, (char *)NULL},
+  { 0 },
 /* 441 */
-    {ERR_USERNOTINCHANNEL, "%s %s :They aren't on that channel"},
+  { ERR_USERNOTINCHANNEL, "%s %s :They aren't on that channel", "441" },
 /* 442 */
-    {ERR_NOTONCHANNEL, "%s :You're not on that channel"},
+  { ERR_NOTONCHANNEL, "%s :You're not on that channel", "442" },
 /* 443 */
-    {ERR_USERONCHANNEL, "%s %s :is already on channel"},
+  { ERR_USERONCHANNEL, "%s %s :is already on channel", "443" },
 /* 444 */
-    {0, (char *)NULL},
+  { 0 },
 /* 445 */
-    {0, (char *)NULL},
+  { 0 },
 /* 446 */
-    {0, (char *)NULL},
+  { 0 },
 /* 447 */
-    {0, (char *)NULL},
+  { 0 },
 /* 448 */
-    {0, (char *)NULL},
+  { 0 },
 /* 449 */
-    {0, (char *)NULL},
+  { 0 },
 /* 450 */
-    {0, (char *)NULL},
+  { 0 },
 /* 451 */
-    {ERR_NOTREGISTERED, ":You have not registered"},
+  { ERR_NOTREGISTERED, ":You have not registered", "451" },
 /* 452 */
-    {0, (char *)NULL},
+  { 0 },
 /* 453 */
-    {0, (char *)NULL},
+  { 0 },
 /* 454 */
-    {0, (char *)NULL},
+  { 0 },
 /* 455 */
-    {0, (char *)NULL},
+  { 0 },
 /* 456 */
-    {0, (char *)NULL},
+  { 0 },
 /* 457 */
-    {0, (char *)NULL},
+  { 0 },
 /* 458 */
-    {0, (char *)NULL},
+  { 0 },
 /* 459 */
-    {0, (char *)NULL},
+  { 0 },
 /* 460 */
-    {0, (char *)NULL},
+  { 0 },
 /* 461 */
-    {ERR_NEEDMOREPARAMS, "%s :Not enough parameters"},
+  { ERR_NEEDMOREPARAMS, "%s :Not enough parameters", "461" },
 /* 462 */
-    {ERR_ALREADYREGISTRED, ":You may not reregister"},
+  { ERR_ALREADYREGISTRED, ":You may not reregister", "462" },
 /* 463 */
-    {ERR_NOPERMFORHOST, ":Your host isn't among the privileged"},
+  { ERR_NOPERMFORHOST, ":Your host isn't among the privileged", "463" },
 /* 464 */
-    {ERR_PASSWDMISMATCH, ":Password Incorrect"},
+  { ERR_PASSWDMISMATCH, ":Password Incorrect", "464" },
 /* 465 */
-    {ERR_YOUREBANNEDCREEP, ":You are banned from this server"},
+  { ERR_YOUREBANNEDCREEP, ":You are banned from this server", "465" },
 /* 466 */
-    {ERR_YOUWILLBEBANNED, (char *)NULL},
+  { ERR_YOUWILLBEBANNED, "", "466" },
 /* 467 */
-    {ERR_KEYSET, "%s :Channel key already set"},
+  { ERR_KEYSET, "%s :Channel key already set", "467" },
 /* 468 */
-    {ERR_INVALIDUSERNAME, (char *)NULL},
+  { ERR_INVALIDUSERNAME, "", "468" },
 /* 469 */
-    {0, (char *)NULL},
+  { 0 },
 /* 470 */
-    {0, (char *)NULL},
+  { 0 },
 /* 471 */
-    {ERR_CHANNELISFULL, "%s :Cannot join channel (+l)"},
+  { ERR_CHANNELISFULL, "%s :Cannot join channel (+l)", "471" },
 /* 472 */
-    {ERR_UNKNOWNMODE, "%c :is unknown mode char to me"},
+  { ERR_UNKNOWNMODE, "%c :is unknown mode char to me", "472" },
 /* 473 */
-    {ERR_INVITEONLYCHAN, "%s :Cannot join channel (+i)"},
+  { ERR_INVITEONLYCHAN, "%s :Cannot join channel (+i)", "473" },
 /* 474 */
-    {ERR_BANNEDFROMCHAN, "%s :Cannot join channel (+b)"},
+  { ERR_BANNEDFROMCHAN, "%s :Cannot join channel (+b)", "474" },
 /* 475 */
-    {ERR_BADCHANNELKEY, "%s :Cannot join channel (+k)"},
+  { ERR_BADCHANNELKEY, "%s :Cannot join channel (+k)", "475" },
 /* 476 */
-    {ERR_BADCHANMASK, "%s :Bad Channel Mask"},
+  { ERR_BADCHANMASK, "%s :Bad Channel Mask", "476" },
 /* 477 */
-    {0, (char *)NULL},
+  { 0 },
 /* 478 */
-    {ERR_BANLISTFULL, "%s %s :Channel ban/ignore list is full"},
+  { ERR_BANLISTFULL, "%s %s :Channel ban/ignore list is full", "478" },
 /* 479 */
-    {ERR_BADCHANNAME, "%s :Cannot join channel (access denied on this server)"},
+  { ERR_BADCHANNAME, "%s :Cannot join channel (access denied on this server)", "479" },
 /* 480 */
-    {0, (char *)NULL},
+  { 0 },
 /* 481 */
-    {ERR_NOPRIVILEGES, ":Permission Denied- You're not an IRC operator"},
+  { ERR_NOPRIVILEGES, ":Permission Denied: You're not an IRC operator", "481" },
 /* 482 */
-    {ERR_CHANOPRIVSNEEDED, "%s :You're not channel operator"},
+  { ERR_CHANOPRIVSNEEDED, "%s :You're not channel operator", "482" },
 /* 483 */
-    {ERR_CANTKILLSERVER, ":You cant kill a server!"},
+  { ERR_CANTKILLSERVER, ":You cant kill a server!", "483" },
 /* 484 */
-    {ERR_ISCHANSERVICE, "%s %s :Cannot kill, kick or deop channel service"},
+  { ERR_ISCHANSERVICE, "%s %s :Cannot kill, kick or deop channel service", "484" },
 /* 485 */
-    {0, (char *)NULL},
+  { 0 },
 /* 486 */
-    {0, (char *)NULL},
+  { 0 },
 /* 487 */
-    {0, (char *)NULL},
+  { 0 },
 /* 488 */
-    {0, (char *)NULL},
+  { 0 },
 /* 489 */
-    {ERR_VOICENEEDED, "%s :You're neither voiced nor channel operator"},
+  { ERR_VOICENEEDED, "%s :You're neither voiced nor channel operator", "489" },
 /* 490 */
-    {0, (char *)NULL},
+  { 0 },
 /* 491 */
-    {ERR_NOOPERHOST, ":No O-lines for your host"},
+  { ERR_NOOPERHOST, ":No O-lines for your host", "491" },
 /* 492 */
-    {0, (char *)NULL},
+  { 0 },
 /* 493 */
-    {0, (char *)NULL},
+  { 0 },
 /* 494 */
-    {0, (char *)NULL},
+  { 0 },
 /* 495 */
-    {0, (char *)NULL},
+  { 0 },
 /* 496 */
-    {0, (char *)NULL},
+  { 0 },
 /* 497 */
-    {0, (char *)NULL},
+  { 0 },
 /* 498 */
-    {ERR_ISOPERLCHAN, "%s %s :Cannot kick or deop an IRC Operator on a local channel"},
+  { ERR_ISOPERLCHAN, "%s %s :Cannot kick or deop an IRC Operator on a local channel", "498" },
 /* 499 */
-    {0, (char *)NULL},
+  { 0 },
 /* 500 */
-    {0, (char *)NULL},
+  { 0 },
 /* 501 */
-    {ERR_UMODEUNKNOWNFLAG, ":Unknown MODE flag"},
+  { ERR_UMODEUNKNOWNFLAG, ":Unknown MODE flag", "501" },
 /* 502 */
-    {ERR_USERSDONTMATCH, ":Cant change mode for other users"},
+  { ERR_USERSDONTMATCH, ":Cant change mode for other users", "502" },
 /* 503 */
-    {0, (char *)NULL},
+  { 0 },
 /* 504 */
-    {0, (char *)NULL},
+  { 0 },
 /* 505 */
-    {0, (char *)NULL},
+  { 0 },
 /* 506 */
-    {0, (char *)NULL},
+  { 0 },
 /* 507 */
-    {0, (char *)NULL},
+  { 0 },
 /* 508 */
-    {0, (char *)NULL},
+  { 0 },
 /* 509 */
-    {0, (char *)NULL},
+  { 0 },
 /* 510 */
-    {0, (char *)NULL},
+  { 0 },
 /* 511 */
-    {ERR_SILELISTFULL, "%s :Your silence list is full"},
+  { ERR_SILELISTFULL, "%s :Your silence list is full", "511" },
 /* 512 */
-    {ERR_NOSUCHGLINE, "%s@%s :No such gline"},
+  { ERR_NOSUCHGLINE, "%s@%s :No such gline", "512" },
 /* 513 */
-    {ERR_BADPING, (char *)NULL}
+  { ERR_BADPING, "", "513" }
 };
 
 static Numeric numeric_replies[] = {
 /* 300 */
-    {RPL_NONE, (char *)NULL},
+  { RPL_NONE, 0, "300" },
 /* 301 */
-    {RPL_AWAY, "%s :%s"},
+  { RPL_AWAY, "%s :%s", "301" },
 /* 302 */
-    {RPL_USERHOST, ":"},
+  { RPL_USERHOST, ":", "302" },
 /* 303 */
-    {RPL_ISON, ":"},
+  { RPL_ISON, ":", "303" },
 /* 304 */
-    {RPL_TEXT, (char *)NULL},
+  { RPL_TEXT, 0, "304" },
 /* 305 */
-    {RPL_UNAWAY, ":You are no longer marked as being away"},
+  { RPL_UNAWAY, ":You are no longer marked as being away", "305" },
 /* 306 */
-    {RPL_NOWAWAY, ":You have been marked as being away"},
+  { RPL_NOWAWAY, ":You have been marked as being away", "306" },
 /* 307 */
-    {RPL_USERIP, ":"},
+  { RPL_USERIP, ":", "307" },
 /* 308 */
-    {0, (char *)NULL},
+  { 0 },
 /* 309 */
-    {0, (char *)NULL},
+  { 0 },
 /* 310 */
-    {0, (char *)NULL},
+  { 0 },
 /* 311 */
-    {RPL_WHOISUSER, "%s %s %s * :%s"},
+  { RPL_WHOISUSER, "%s %s %s * :%s", "311" },
 /* 312 */
-    {RPL_WHOISSERVER, "%s %s :%s"},
+  { RPL_WHOISSERVER, "%s %s :%s", "312" },
 /* 313 */
-    {RPL_WHOISOPERATOR, "%s :is an IRC Operator"},
+  { RPL_WHOISOPERATOR, "%s :is an IRC Operator", "313" },
 /* 314 */
-    {RPL_WHOWASUSER, "%s %s %s * :%s"},
+  { RPL_WHOWASUSER, "%s %s %s * :%s", "314" },
 /* 315 */
-    {RPL_ENDOFWHO, "%s :End of /WHO list."},
+  { RPL_ENDOFWHO, "%s :End of /WHO list.", "315" },
 /* 316 */
-    {0, (char *)NULL},
+  { 0 },
 /* 317 */
-    {RPL_WHOISIDLE, "%s %ld %ld :seconds idle, signon time"},
+  { RPL_WHOISIDLE, "%s %ld %ld :seconds idle, signon time", "317" },
 /* 318 */
-    {RPL_ENDOFWHOIS, "%s :End of /WHOIS list."},
+  { RPL_ENDOFWHOIS, "%s :End of /WHOIS list.", "318" },
 /* 319 */
-    {RPL_WHOISCHANNELS, "%s :%s"},
+  { RPL_WHOISCHANNELS, "%s :%s", "319" },
 /* 320 */
-    {0, (char *)NULL},
+  { 0 },
 /* 321 */
-    {RPL_LISTSTART, "Channel :Users  Name"},
+  { RPL_LISTSTART, "Channel :Users  Name", "321" },
 /* 322 */
-    {RPL_LIST, "%s %d :%s"},
+  { RPL_LIST, "%s %d :%s", "322" },
 /* 323 */
-    {RPL_LISTEND, ":End of /LIST"},
+  { RPL_LISTEND, ":End of /LIST", "323" },
 /* 324 */
-    {RPL_CHANNELMODEIS, "%s %s %s"},
+  { RPL_CHANNELMODEIS, "%s %s %s", "324" },
 /* 325 */
-    {0, (char *)NULL},
+  { 0 },
 /* 326 */
-    {0, (char *)NULL},
+  { 0 },
 /* 327 */
-    {0, (char *)NULL},
+  { 0 },
 /* 328 */
-    {0, (char *)NULL},
+  { 0 },
 /* 329 */
-    {RPL_CREATIONTIME, "%s " TIME_T_FMT},
+  { RPL_CREATIONTIME, "%s " TIME_T_FMT, "329" },
 /* 330 */
-    {0, (char *)NULL},
+  { 0 },
 /* 331 */
-    {RPL_NOTOPIC, "%s :No topic is set."},
+  { RPL_NOTOPIC, "%s :No topic is set.", "331" },
 /* 332 */
-    {RPL_TOPIC, "%s :%s"},
+  { RPL_TOPIC, "%s :%s", "332" },
 /* 333 */
-    {RPL_TOPICWHOTIME, "%s %s " TIME_T_FMT},
+  { RPL_TOPICWHOTIME, "%s %s " TIME_T_FMT, "333" },
 /* 334 */
-    {RPL_LISTUSAGE, ":%s"},
+  { RPL_LISTUSAGE, ":%s", "334" },
 /* 335 */
-    {0, (char *)NULL},
+  { 0 },
 /* 336 */
-    {0, (char *)NULL},
+  { 0 },
 /* 337 */
-    {0, (char *)NULL},
+  { 0 },
 /* 338 */
-    {0, (char *)NULL},
+  { 0 },
 /* 339 */
-    {0, (char *)NULL},
+  { 0 },
 /* 340 */
-    {0, (char *)NULL},
+  { 0 },
 /* 341 */
-    {RPL_INVITING, "%s %s"},
+  { RPL_INVITING, "%s %s", "341" },
 /* 342 */
-    {0, (char *)NULL},
+  { 0 },
 /* 343 */
-    {0, (char *)NULL},
+  { 0 },
 /* 344 */
-    {0, (char *)NULL},
+  { 0 },
 /* 345 */
-    {0, (char *)NULL},
+  { 0 },
 /* 346 */
-    {0, (char *)NULL},
+  { RPL_INVITELIST, ":%s", "346" },
 /* 347 */
-    {0, (char *)NULL},
+  { RPL_ENDOFINVITELIST, ":End of Invite List", "347" },
 /* 348 */
-    {0, (char *)NULL},
+  { 0 },
 /* 349 */
-    {0, (char *)NULL},
+  { 0 },
 /* 350 */
-    {0, (char *)NULL},
+  { 0 },
 /* 351 */
-    {RPL_VERSION, "%s.%s %s :%s"},
+  { RPL_VERSION, "%s.%s %s :%s", "351" },
 /* 352 */
-    {RPL_WHOREPLY, "%s"},
+  { RPL_WHOREPLY, "%s", "352" },
 /* 353 */
-    {RPL_NAMREPLY, "%s"},
+  { RPL_NAMREPLY, "%s", "353" },
 /* 354 */
-    {RPL_WHOSPCRPL, "%s"},
+  { RPL_WHOSPCRPL, "%s", "354" },
 /* 355 */
-    {0, (char *)NULL},
+  { 0 },
 /* 356 */
-    {0, (char *)NULL},
+  { 0 },
 /* 357 */
-    {0, (char *)NULL},
+  { 0 },
 /* 358 */
-    {0, (char *)NULL},
+  { 0 },
 /* 359 */
-    {0, (char *)NULL},
+  { 0 },
 /* 360 */
-    {0, (char *)NULL},
+  { 0 },
 /* 361 */
-    {RPL_KILLDONE, (char *)NULL},
+  { RPL_KILLDONE, 0, "361" },
 /* 362 */
-    {RPL_CLOSING, "%s :Closed. Status = %d"},
+  { RPL_CLOSING, "%s :Closed. Status = %d", "362" },
 /* 363 */
-    {RPL_CLOSEEND, "%d: Connections Closed"},
+  { RPL_CLOSEEND, "%d: Connections Closed", "363" },
 /* 364 */
 #ifndef GODMODE
-    {RPL_LINKS, "%s %s :%d P%u %s"},
+  { RPL_LINKS, "%s %s :%d P%u %s", "364" },
 #else /* GODMODE */
-    {RPL_LINKS, "%s %s :%d P%u " TIME_T_FMT " (%s) %s"},
+  { RPL_LINKS, "%s %s :%d P%u " TIME_T_FMT " (%s) %s", "364" },
 #endif /* GODMODE */
 /* 365 */
-    {RPL_ENDOFLINKS, "%s :End of /LINKS list."},
+  { RPL_ENDOFLINKS, "%s :End of /LINKS list.", "365" },
 /* 366 */
-    {RPL_ENDOFNAMES, "%s :End of /NAMES list."},
+  { RPL_ENDOFNAMES, "%s :End of /NAMES list.", "366" },
 /* 367 */
-    {RPL_BANLIST, "%s %s %s " TIME_T_FMT},
+  { RPL_BANLIST, "%s %s %s " TIME_T_FMT, "367" },
 /* 368 */
-    {RPL_ENDOFBANLIST, "%s :End of Channel Ban List"},
+  { RPL_ENDOFBANLIST, "%s :End of Channel Ban List", "368" },
 /* 369 */
-    {RPL_ENDOFWHOWAS, "%s :End of WHOWAS"},
+  { RPL_ENDOFWHOWAS, "%s :End of WHOWAS", "369" },
 /* 370 */
-    {0, (char *)NULL},
+  { 0 },
 /* 371 */
-    {RPL_INFO, ":%s"},
+  { RPL_INFO, ":%s", "371" },
 /* 372 */
-    {RPL_MOTD, ":- %s"},
+  { RPL_MOTD, ":- %s", "372" },
 /* 373 */
-    {RPL_INFOSTART, ":Server INFO"},
+  { RPL_INFOSTART, ":Server INFO", "373" },
 /* 374 */
-    {RPL_ENDOFINFO, ":End of /INFO list."},
+  { RPL_ENDOFINFO, ":End of /INFO list.", "374" },
 /* 375 */
-    {RPL_MOTDSTART, ":- %s Message of the Day - "},
+  { RPL_MOTDSTART, ":- %s Message of the Day - ", "375" },
 /* 376 */
-    {RPL_ENDOFMOTD, ":End of /MOTD command."},
+  { RPL_ENDOFMOTD, ":End of /MOTD command.", "376" },
 /* 377 */
-    {0, (char *)NULL},
+  { 0 },
 /* 378 */
-    {0, (char *)NULL},
+  { 0 },
 /* 379 */
-    {0, (char *)NULL},
+  { 0 },
 /* 380 */
-    {0, (char *)NULL},
+  { 0 },
 /* 381 */
-    {RPL_YOUREOPER, ":You are now an IRC Operator"},
+  { RPL_YOUREOPER, ":You are now an IRC Operator", "381" },
 /* 382 */
-    {RPL_REHASHING, "%s :Rehashing"},
+  { RPL_REHASHING, "%s :Rehashing", "382" },
 /* 383 */
-    {0, (char *)NULL},
+  { 0 },
 /* 384 */
-    {RPL_MYPORTIS, "%d :Port to local server is\r\n"},
+  { RPL_MYPORTIS, "%d :Port to local server is", "384" },
 /* 385 */
-    {RPL_NOTOPERANYMORE, (char *)NULL},
+  { RPL_NOTOPERANYMORE, 0, "385" },
 /* 386 */
-    {0, (char *)NULL},
+  { 0 },
 /* 387 */
-    {0, (char *)NULL},
+  { 0 },
 /* 388 */
-    {0, (char *)NULL},
+  { 0 },
 /* 389 */
-    {0, (char *)NULL},
+  { 0 },
 /* 390 */
-    {0, (char *)NULL},
+  { 0 },
 /* 391 */
-    {RPL_TIME, "%s " TIME_T_FMT " %ld :%s"},
+  { RPL_TIME, "%s " TIME_T_FMT " %ld :%s", "391" },
 /* 392 */
-    {0, (char *)NULL},
+  { 0 },
 /* 393 */
-    {0, (char *)NULL},
+  { 0 },
 /* 394 */
-    {0, (char *)NULL},
+  { 0 },
 /* 395 */
-    {0, (char *)NULL},
+  { 0 },
 /* 396 */
-    {0, (char *)NULL},
+  { 0 },
 /* 397 */
-    {0, (char *)NULL},
+  { 0 },
 /* 398 */
-    {0, (char *)NULL},
+  { 0 },
 /* 399 */
-    {0, (char *)NULL},
+  { 0 },
 /* 200 */
 #ifndef GODMODE
-    {RPL_TRACELINK, "Link %s%s %s %s"},
+  { RPL_TRACELINK, "Link %s%s %s %s", "200" },
 #else /* GODMODE */
-    {RPL_TRACELINK, "Link %s%s %s %s " TIME_T_FMT},
+  { RPL_TRACELINK, "Link %s%s %s %s " TIME_T_FMT, "200" },
 #endif /* GODMODE */
 /* 201 */
-    {RPL_TRACECONNECTING, "Try. %d %s"},
+  { RPL_TRACECONNECTING, "Try. %d %s", "201" },
 /* 202 */
-    {RPL_TRACEHANDSHAKE, "H.S. %d %s"},
+  { RPL_TRACEHANDSHAKE, "H.S. %d %s", "202" },
 /* 203 */
-    {RPL_TRACEUNKNOWN, "???? %d %s"},
+  { RPL_TRACEUNKNOWN, "???? %d %s", "203" },
 /* 204 */
-    {RPL_TRACEOPERATOR, "Oper %d %s %ld"},
+  { RPL_TRACEOPERATOR, "Oper %d %s %ld", "204" },
 /* 205 */
-    {RPL_TRACEUSER, "User %d %s %ld"},
+  { RPL_TRACEUSER, "User %d %s %ld", "205" },
 /* 206 */
-    {RPL_TRACESERVER, "Serv %d %dS %dC %s %s!%s@%s %ld %ld"},
+  { RPL_TRACESERVER, "Serv %d %dS %dC %s %s!%s@%s %ld %ld", "206" },
 /* 207 */
-    {0, (char *)NULL},
+  { 0 },
 /* 208 */
-    {RPL_TRACENEWTYPE, "<newtype> 0 %s"},
+  { RPL_TRACENEWTYPE, "<newtype> 0 %s", "208" },
 /* 209 */
-    {RPL_TRACECLASS, "Class %d %d"},
+  { RPL_TRACECLASS, "Class %d %d", "209" },
 /* 210 */
-    {0, (char *)NULL},
+  { 0 },
 /* 211 */
-    {RPL_STATSLINKINFO, (char *)NULL},
+  { RPL_STATSLINKINFO, 0, "211" },
 /* 212 */
-    {RPL_STATSCOMMANDS, "%s %u %u"},
+  { RPL_STATSCOMMANDS, "%s %u %u", "212" },
 /* 213 */
-    {RPL_STATSCLINE, "%c %s * %s %d %d"},
+  { RPL_STATSCLINE, "%c %s * %s %d %d", "213" },
 /* 214 */
-    {RPL_STATSNLINE, "%c %s * %s %d %d"},
+  { RPL_STATSNLINE, "%c %s * %s %d %d", "214" },
 /* 215 */
-    {RPL_STATSILINE, "%c %s * %s %d %d"},
+  { RPL_STATSILINE, "%c %s * %s %d %d", "215" },
 /* 216 */
-    {RPL_STATSKLINE, "%c %s %s %s %d %d"},
+  { RPL_STATSKLINE, "%c %s %s %s %d %d", "216" },
 /* 217 */
-    {RPL_STATSPLINE, "%c %d %d %#x"},
+  { RPL_STATSPLINE, "P %d %d %s %s", "217" },
 /* 218 */
-    {RPL_STATSYLINE, "%c %d %d %d %d %ld"},
+  { RPL_STATSYLINE, "%c %d %d %d %d %ld", "218" },
 /* 219 */
-    {RPL_ENDOFSTATS, "%c :End of /STATS report"},
+  { RPL_ENDOFSTATS, "%c :End of /STATS report", "219" },
 /* 220 */
-    {0, (char *)NULL},
+  { 0 },
 /* 221 */
-    {RPL_UMODEIS, "%s"},
+  { RPL_UMODEIS, "%s", "221" },
 /* 222 */
-    {0, (char *)NULL},
+  { 0 },
 /* 223 */
-    {0, (char *)NULL},
+  { 0 },
 /* 224 */
-    {0, (char *)NULL},
+  { 0 },
 /* 225 */
-    {0, (char *)NULL},
+  { 0 },
 /* 226 */
-    {0, (char *)NULL},
+  { 0 },
 /* 227 */
-    {0, (char *)NULL},
+  { 0 },
 /* 228 */
-    {0, (char *)NULL},
+  { 0 },
 /* 229 */
-    {0, (char *)NULL},
+  { 0 },
 /* 230 */
-    {0, (char *)NULL},
+  { 0 },
 /* 231 */
-    {RPL_SERVICEINFO, (char *)NULL},
+  { RPL_SERVICEINFO, 0, "231" },
 /* 232 */
-    {RPL_ENDOFSERVICES, (char *)NULL},
+  { RPL_ENDOFSERVICES, 0, "232" },
 /* 233 */
-    {RPL_SERVICE, (char *)NULL},
+  { RPL_SERVICE, 0, "233" },
 /* 234 */
-    {RPL_SERVLIST, (char *)NULL},
+  { RPL_SERVLIST, 0, "234" },
 /* 235 */
-    {RPL_SERVLISTEND, (char *)NULL},
+  { RPL_SERVLISTEND, 0, "235" },
 /* 236 */
-    {0, (char *)NULL},
+  { 0 },
 /* 237 */
-    {0, (char *)NULL},
+  { 0 },
 /* 238 */
-    {0, (char *)NULL},
+  { 0 },
 /* 239 */
-    {0, (char *)NULL},
+  { 0 },
 /* 240 */
-    {0, (char *)NULL},
+  { 0 },
 /* 241 */
-    {RPL_STATSLLINE, "%c %s * %s %d %d"},
+  { RPL_STATSLLINE, "%c %s * %s %d %d", "241" },
 /* 242 */
-    {RPL_STATSUPTIME, ":Server Up %d days, %d:%02d:%02d"},
+  { RPL_STATSUPTIME, ":Server Up %d days, %d:%02d:%02d", "242" },
 /* 243 */
-    {RPL_STATSOLINE, "%c %s * %s %d %d"},
+  { RPL_STATSOLINE, "%c %s * %s %d %d", "243" },
 /* 244 */
-    {RPL_STATSHLINE, "%c %s * %s %d %d"},
+  { RPL_STATSHLINE, "%c %s * %s %d %d", "244" },
 /* 245 */
-    {0, (char *)NULL},
+  { 0 },
 /* 246 */
-    {RPL_STATSTLINE, "%c %s %s"},
+  { RPL_STATSTLINE, "%c %s %s", "246" },
 /* 247 */
-    {RPL_STATSGLINE, "%c %s@%s " TIME_T_FMT " :%s"},
+  { RPL_STATSGLINE, "%c %s@%s " TIME_T_FMT " :%s", "247" },
 /* 248 */
-    {RPL_STATSULINE, "%c %s %s %s %d %d"},
+  { RPL_STATSULINE, "%c %s %s %s %d %d", "248" },
 /* 249 */
-    {0, (char *)NULL},
+  { 0 },
 /* 250 */
-    {RPL_STATSCONN, ":Highest connection count: %d (%d clients)"},
+  { RPL_STATSCONN, ":Highest connection count: %d (%d clients)", "250" },
 /* 251 */
-    {RPL_LUSERCLIENT, ":There are %d users and %d invisible on %d servers"},
+  { RPL_LUSERCLIENT, ":There are %d users and %d invisible on %d servers", "251" },
 /* 252 */
-    {RPL_LUSEROP, "%d :operator(s) online"},
+  { RPL_LUSEROP, "%d :operator(s) online", "252" },
 /* 253 */
-    {RPL_LUSERUNKNOWN, "%d :unknown connection(s)"},
+  { RPL_LUSERUNKNOWN, "%d :unknown connection(s)", "253" },
 /* 254 */
-    {RPL_LUSERCHANNELS, "%d :channels formed"},
+  { RPL_LUSERCHANNELS, "%d :channels formed", "254" },
 /* 255 */
-    {RPL_LUSERME, ":I have %d clients and %d servers"},
+  { RPL_LUSERME, ":I have %d clients and %d servers", "255" },
 /* 256 */
-    {RPL_ADMINME, ":Administrative info about %s"},
+  { RPL_ADMINME, ":Administrative info about %s", "256" },
 /* 257 */
-    {RPL_ADMINLOC1, ":%s"},
+  { RPL_ADMINLOC1, ":%s", "257" },
 /* 258 */
-    {RPL_ADMINLOC2, ":%s"},
+  { RPL_ADMINLOC2, ":%s", "258" },
 /* 259 */
-    {RPL_ADMINEMAIL, ":%s"},
+  { RPL_ADMINEMAIL, ":%s", "259" },
 /* 260 */
-    {0, (char *)NULL},
+  { 0 },
 /* 261 */
-    {RPL_TRACELOG, "File %s %d"},
+  { RPL_TRACELOG, "File %s %d", "261" },
 /* 262 */
-    {RPL_TRACEPING, "Ping %s %s"},
+  { RPL_TRACEPING, "Ping %s %s", "262" },
 /* 263 */
-    {0, (char *)NULL},
+  { 0 },
 /* 264 */
-    {0, (char *)NULL},
+  { 0 },
 /* 265 */
-    {0, (char *)NULL},
+  { 0 },
 /* 266 */
-    {0, (char *)NULL},
+  { 0 },
 /* 267 */
-    {0, (char *)NULL},
+  { 0 },
 /* 268 */
-    {0, (char *)NULL},
+  { 0 },
 /* 269 */
-    {0, (char *)NULL},
+  { 0 },
 /* 270 */
-    {0, (char *)NULL},
+  { 0 },
 /* 271 */
-    {RPL_SILELIST, "%s %s"},
+  { RPL_SILELIST, "%s %s", "271" },
 /* 272 */
-    {RPL_ENDOFSILELIST, "%s :End of Silence List"},
+  { RPL_ENDOFSILELIST, "%s :End of Silence List", "272" },
 /* 273 */
-    {0, (char *)NULL},
+  { 0 },
 /* 274 */
-    {0, (char *)NULL},
+  { 0 },
 /* 275 */
-    {RPL_STATSDLINE, "%c %s %s"},
+  { RPL_STATSDLINE, "%c %s %s", "275" },
 /* 276 */
-    {0, (char *)NULL},
+  { 0 },
 /* 277 */
-    {0, (char *)NULL},
+  { 0 },
 /* 278 */
-    {0, (char *)NULL},
+  { 0 },
 /* 279 */
-    {0, (char *)NULL},
+  { 0 },
 /* 280 */
-    {RPL_GLIST, "%s@%s " TIME_T_FMT " %s%s"},
+  { RPL_GLIST, "%s@%s " TIME_T_FMT " %s%s", "280" },
 /* 281 */
-    {RPL_ENDOFGLIST, ":End of G-line List"}
+  { RPL_ENDOFGLIST, ":End of G-line List", "281" },
+/* 283 */
+  { 0 },
+/* 284 */
+  { 0 }
 };
 
-/* *INDENT-ON* */
+const struct Numeric* get_error_numeric(int numeric)
+{
+  int num = numeric;
+  assert(ERR_FIRSTERROR < num);
+  assert(num < ERR_INVALID_ERROR);
+
+  num -= ERR_FIRSTERROR;
+  assert(0 != numeric_errors[num].value);
+
+  return &numeric_errors[num];
+}
 
 static char numbuff[512];
 
 /* "inline" */
-#define prepbuf(buffer, num, tail)                     \
-{                                                      \
-  register char *s = buffer + 4;                       \
-  register const char *ap = atoi_tab + (num << 2);     \
-                                                       \
-  strcpy(buffer, ":%s 000 %s ");                       \
-  *s++ = *ap++;                                                \
-  *s++ = *ap++;                                                \
-  *s = *ap;                                            \
-  strcpy(s + 5, tail);                                 \
+#define prepbuf(buffer, num, tail)                      \
+{                                                       \
+  char *s = buffer + 4;                 \
+  const char *ap = atoi_tab + (num << 2);       \
+                                                        \
+  strcpy(buffer, ":%s 000 %s ");                        \
+  *s++ = *ap++;                                         \
+  *s++ = *ap++;                                         \
+  *s = *ap;                                             \
+  strcpy(s + 5, tail);                                  \
 }
 
 char *err_str(int numeric)
 {
-  Reg1 Numeric *nptr;
-  Reg2 int num = numeric;
+  Numeric *nptr;
+  int num = numeric;
 
-  num -= numeric_errors[0].num_val;
+  num -= numeric_errors[0].value;
 
 #ifdef DEBUGMODE
   if (num < 0 || num > ERR_USERSDONTMATCH)
     sprintf_irc(numbuff,
-       ":%%s %d %%s :INTERNAL ERROR: BAD NUMERIC! %d", numeric, num);
+        ":%%s %d %%s :INTERNAL ERROR: BAD NUMERIC! %d", numeric, num);
   else
   {
     nptr = &numeric_errors[num];
-    if (!nptr->num_form || !nptr->num_val)
+    if (!nptr->format || !nptr->value)
       sprintf_irc(numbuff, ":%%s %d %%s :NO ERROR FOR NUMERIC ERROR %d",
-         numeric, num);
+          numeric, num);
     else
-      prepbuf(numbuff, nptr->num_val, nptr->num_form);
+      prepbuf(numbuff, nptr->value, nptr->format);
   }
 #else
   nptr = &numeric_errors[num];
-  prepbuf(numbuff, nptr->num_val, nptr->num_form);
+  prepbuf(numbuff, nptr->value, nptr->format);
 #endif
 
   return numbuff;
@@ -713,8 +735,8 @@ char *err_str(int numeric)
 
 char *rpl_str(int numeric)
 {
-  Reg1 Numeric *nptr;
-  Reg2 int num = numeric;
+  Numeric *nptr;
+  int num = numeric;
 
   if (num > (int)(sizeof(local_replies) / sizeof(Numeric) - 2))
     num -= (num > 300) ? 300 : 100;
@@ -722,27 +744,27 @@ char *rpl_str(int numeric)
 #ifdef DEBUGMODE
   if (num < 0 || num > 200)
     sprintf_irc(numbuff, ":%%s %d %%s :INTERNAL REPLY ERROR: BAD NUMERIC! %d",
-       numeric, num);
+        numeric, num);
   else
   {
     if (numeric > 99)
       nptr = &numeric_replies[num];
     else
       nptr = &local_replies[num];
-    Debug((DEBUG_NUM, "rpl_str: numeric %d num %d nptr %p %d %p",
-       numeric, num, nptr, nptr->num_val, nptr->num_form));
-    if (!nptr->num_form || !nptr->num_val)
+    Debug((DEBUG_NUM, "rpl_str: numeric %d num %d %d %s",
+        numeric, num, nptr->value, nptr->format ? nptr->format : ""));
+    if (!nptr->format || !nptr->value)
       sprintf_irc(numbuff, ":%%s %d %%s :NO REPLY FOR NUMERIC ERROR %d",
-         numeric, num);
+          numeric, num);
     else
-      prepbuf(numbuff, nptr->num_val, nptr->num_form);
+      prepbuf(numbuff, nptr->value, nptr->format);
   }
 #else
   if (numeric > 99)
     nptr = &numeric_replies[num];
   else
     nptr = &local_replies[num];
-  prepbuf(numbuff, nptr->num_val, nptr->num_form);
+  prepbuf(numbuff, nptr->value, nptr->format);
 #endif
 
   return numbuff;