diff --git a/include/psyc.h b/include/psyc.h index 5c3076d..1a3506a 100644 --- a/include/psyc.h +++ b/include/psyc.h @@ -94,6 +94,14 @@ typedef enum { PSYC_LIST_BINARY = 2, } PsycListType; +typedef enum PsycMessageFlag { + PSYC_MESSAGE_TEMPLATE = 1 << 0, + PSYC_MESSAGE_REPLY = 1 << 1, + PSYC_MESSAGE_VISIBLE = 1 << 2, + PSYC_MESSAGE_LOGGABLE = 1 << 3, + PSYC_MESSAGE_MANUAL = 1 << 4, +} PsycMessageFlag; + /** * String struct. * diff --git a/include/psyc/packet.h b/include/psyc/packet.h index 8dc92db..1b81cff 100644 --- a/include/psyc/packet.h +++ b/include/psyc/packet.h @@ -67,6 +67,21 @@ typedef enum { PSYC_STATE_RESYNC = '?', } PsycStateOp; +typedef enum PsycMethod { + PSYC_METHOD_UNKNOWN, + PSYC_METHOD_DATA, + PSYC_METHOD_ECHO, + PSYC_METHOD_ERROR, + PSYC_METHOD_FAILURE, + PSYC_METHOD_INFO, + PSYC_METHOD_MESSAGE, + PSYC_METHOD_MESSAGE_ECHO, + PSYC_METHOD_NOTICE, + PSYC_METHOD_REQUEST, + PSYC_METHOD_STATUS, + PSYC_METHOD_WARNING, +} PsycMethod; + /** Structure for a modifier. */ typedef struct { char oper; diff --git a/include/psyc/variable.h b/include/psyc/variable.h index 957698e..fb9ce67 100644 --- a/include/psyc/variable.h +++ b/include/psyc/variable.h @@ -1,10 +1,12 @@ -#ifndef PSYC_VARIABLE_H -#define PSYC_VARIABLE_H - /** * @file psyc/variable.h */ +#ifndef PSYC_VARIABLE_H +#define PSYC_VARIABLE_H + +#include "packet.h" + /// Routing variables in alphabetical order. extern const PsycString psyc_routing_vars[]; @@ -36,4 +38,7 @@ psyc_var_is_list (const char *name, size_t len) ? PSYC_FALSE : PSYC_TRUE; } +PsycMethod +psyc_method_family (char *method, size_t methodlen, unsigned int *flag); + #endif diff --git a/src/variable.c b/src/variable.c index 396dc39..e202757 100644 --- a/src/variable.c +++ b/src/variable.c @@ -1,6 +1,8 @@ #include "lib.h" #include +#include + /// Routing variables in alphabetical order. const PsycString psyc_routing_vars[] = { @@ -44,8 +46,22 @@ const PsycDictInt psyc_var_types[] = { {PSYC_C2STRI("_uniform"), PSYC_TYPE_UNIFORM}, }; +const PsycDictInt psyc_method_families[] = { + {PSYC_C2STRI("_data"), PSYC_METHOD_DATA}, + {PSYC_C2STRI("_echo"), PSYC_METHOD_ECHO}, + {PSYC_C2STRI("_failure"), PSYC_METHOD_FAILURE}, + {PSYC_C2STRI("_info"), PSYC_METHOD_INFO}, + {PSYC_C2STRI("_message"), PSYC_METHOD_MESSAGE}, + {PSYC_C2STRI("_message_echo"), PSYC_METHOD_MESSAGE_ECHO}, + {PSYC_C2STRI("_notice"), PSYC_METHOD_NOTICE}, + {PSYC_C2STRI("_request"), PSYC_METHOD_REQUEST}, + {PSYC_C2STRI("_status"), PSYC_METHOD_STATUS}, + {PSYC_C2STRI("_warning"), PSYC_METHOD_WARNING}, +}; + const size_t psyc_routing_vars_num = PSYC_NUM_ELEM(psyc_routing_vars); const size_t psyc_var_types_num = PSYC_NUM_ELEM(psyc_var_types); +const size_t psyc_method_families_num = PSYC_NUM_ELEM(psyc_method_families); /** * Get the type of variable name. @@ -97,3 +113,60 @@ psyc_var_type (const char *name, size_t len) psyc_var_types_num, name, len, PSYC_YES, (int8_t *) &m); } + +/** + * Get the family and flags for a method. + */ +PsycMethod +psyc_method_family (char *method, size_t methodlen, unsigned int *flag) +{ + int8_t tmp[PSYC_NUM_ELEM(psyc_method_families)]; + int mc = psyc_dict_lookup_int(psyc_method_families, psyc_method_families_num, + method, methodlen, PSYC_YES, tmp); + + if (!flag) + return mc; + + switch (mc) { + case PSYC_METHOD_DATA: + break; + case PSYC_METHOD_ECHO: + *flag = PSYC_MESSAGE_TEMPLATE | PSYC_MESSAGE_REPLY | PSYC_MESSAGE_VISIBLE; + break; + case PSYC_METHOD_ERROR: + *flag = PSYC_MESSAGE_TEMPLATE | PSYC_MESSAGE_REPLY | PSYC_MESSAGE_VISIBLE + | PSYC_MESSAGE_LOGGABLE; + break; + case PSYC_METHOD_FAILURE: + *flag = PSYC_MESSAGE_TEMPLATE | PSYC_MESSAGE_REPLY | PSYC_MESSAGE_VISIBLE + | PSYC_MESSAGE_LOGGABLE; + break; + case PSYC_METHOD_INFO: + *flag = PSYC_MESSAGE_TEMPLATE | PSYC_MESSAGE_REPLY | PSYC_MESSAGE_VISIBLE + | PSYC_MESSAGE_LOGGABLE; + break; + case PSYC_METHOD_MESSAGE: + *flag = PSYC_MESSAGE_VISIBLE | PSYC_MESSAGE_LOGGABLE | PSYC_MESSAGE_MANUAL; + break; + case PSYC_METHOD_MESSAGE_ECHO: + *flag = PSYC_MESSAGE_REPLY | PSYC_MESSAGE_VISIBLE | PSYC_MESSAGE_LOGGABLE + | PSYC_MESSAGE_MANUAL; + break; + case PSYC_METHOD_NOTICE: + *flag = PSYC_MESSAGE_TEMPLATE | PSYC_MESSAGE_VISIBLE | PSYC_MESSAGE_LOGGABLE; + break; + case PSYC_METHOD_REQUEST: + *flag = PSYC_MESSAGE_TEMPLATE | PSYC_MESSAGE_VISIBLE | PSYC_MESSAGE_LOGGABLE; + break; + case PSYC_METHOD_STATUS: + *flag = PSYC_MESSAGE_TEMPLATE | PSYC_MESSAGE_REPLY | PSYC_MESSAGE_VISIBLE + | PSYC_MESSAGE_LOGGABLE; + break; + case PSYC_METHOD_WARNING: + *flag = PSYC_MESSAGE_TEMPLATE | PSYC_MESSAGE_REPLY | PSYC_MESSAGE_VISIBLE + | PSYC_MESSAGE_LOGGABLE; + break; + } + + return mc; +}