00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef USE_PCH
00017 #include "sys.h"
00018 #include <cctype>
00019 #include <cstring>
00020 #include "debug.h"
00021 #endif
00022
00023 #include "Application.h"
00024 #include "MessageIn.h"
00025 #include "msg_key.h"
00026
00027 MessageIn::MessageIn(void) : M_msg_block(Application::instance().dummy_msg_block())
00028 {
00029 Dout(dc::objects, "Constructing MessageIn()");
00030 }
00031
00032 void MessageIn::init(msg_block_ct msg_block)
00033 {
00034 M_msg_block = msg_block;
00035 char const* p = msg_block.get_start();
00036 char const* e = p + msg_block.get_size();
00037 ASSERT(msg_block.get_size() > 0);
00038 --e;
00039 ASSERT(*e == '\n');
00040 if (e[-1] == '\r')
00041 --e;
00042 M_end = e;
00043 while (*p == ' ')
00044 ++p;
00045
00046
00047 if (*p == ':')
00048 {
00049 char const* prefix_start = p + 1;
00050 while (p < e && *++p != ' ');
00051 M_prefix.set(prefix_start, p);
00052 while (*p == ' ')
00053 ++p;
00054 }
00055 else
00056 M_prefix.clear();
00057
00058
00059 if (p == e)
00060 {
00061 M_command.clear();
00062 M_params.clear();
00063 return;
00064 }
00065 char const* start = p;
00066 while (p < e && *++p != ' ');
00067 M_command.set(start, p);
00068 if (is_numeric())
00069 M_key = atoi(start);
00070 else
00071 {
00072 M_key = 0;
00073 static char buf[MAX_WORD_LENGTH];
00074 if (M_command.len() <= sizeof(buf))
00075 {
00076 for (size_t i = 0; i < M_command.len(); ++i)
00077 buf[i] = std::toupper(start[i]);
00078 M_keyword_ptr = msg_key(buf, M_command.len());
00079 if (M_keyword_ptr)
00080 M_key = M_keyword_ptr->value;
00081 }
00082 }
00083
00084
00085 M_params.clear();
00086 for (; p < e; ++p)
00087 {
00088 if (*p == ' ')
00089 continue;
00090 if (p == e)
00091 return;
00092 start = p;
00093 if (*p == ':')
00094 {
00095 M_params.push_back(Part(p + 1, e));
00096 return;
00097 }
00098 while (p < e && *++p != ' ');
00099 M_params.push_back(Part(start, p));
00100 }
00101 }
00102