110     if (nul == -1 && (
octstr_len(os) - *pos) > 1) {
   136     pdu = gw_malloc(
sizeof(*pdu));
   140     #define NONTERMINATED(name) p->name = NULL;   141     #define COMATERMINATED(name) p->name = NULL;   142     #define PDU(name, id, fields) \   144         struct name *p = &pdu->u.name; \   145         pdu->type_name = #name; \   146         pdu->needs_hyphen = (id < SMASI_HYPHEN_ID ? 1 : 0); \   151         warning(0, 
"Unknown SMASI_PDU type, internal error.");
   166     #define NONTERMINATED(name) octstr_destroy(p->name);   167     #define COMATERMINATED(name) octstr_destroy(p->name);   168     #define PDU(name, id, fields) \   169         case id: { struct name *p = &pdu->u.name; fields } break;   172         error(0, 
"Unknown SMASI_PDU type, internal error while destroying.");
   189     #define NONTERMINATED(name) p = *(&p);   190     #define COMATERMINATED(name) p = *(&p);   191     #define PDU(name, id, fields) \   192         case id: { struct name *p = &pdu->u.name; fields } break;   195         error(0, 
"Unknown SMASI_PDU type, internal error while packing.");
   199     #define NONTERMINATED(name) p = *(&p);   200     #define COMATERMINATED(name) \   201     if (p->name != NULL) { octstr_append_cstr(os, #name); \   202     octstr_append_char(os, '='); \   203     octstr_append(os, p->name); \   204     octstr_append_char(os, ','); }   205     #define PDU(name, id, fields) \   206         case id: { struct name *p = &pdu->u.name; fields } break;   209         error(0, 
"Unknown SMASI_PDU type, internal error while packing.");
   229     unsigned long type = 0;
   235     if (strcmp(type_name, 
"dummy") == 0) 
type = 0;
   236     #define NONTERMINATED(name) p = *(&p);   237     #define COMATERMINATED(name) p = *(&p);   238     #define PDU(name, id, fields) \   239     else if (strcmp(type_name, #name) == 0) type = id;   241     else warning(0, 
"unknown SMASI PDU type");
   244     if (pdu == NULL) 
return NULL;
   250     #define NONTERMINATED(name) p = *(&p);   251     #define COMATERMINATED(name) \   252                 if (octstr_str_compare(field_name, #name) == 0 && field_value != NULL) \   253                     p->name = octstr_duplicate(field_value);   254     #define PDU(name, id, fields) \   256             Octstr * field_name = NULL; \   257             Octstr * field_value = NULL; \   258             struct name *p = &pdu->u.name; \   259             while (pos < octstr_len(data_without_len)) { \   260                 field_name = copy_until_assign(data_without_len, &pos); \   261                 if (field_name == NULL) break; \   262                 field_value = copy_until_coma(data_without_len, &pos); \   263                 if (field_value == NULL) continue; \   265                 octstr_destroy(field_name); \   266                 octstr_destroy(field_value); \   271         warning(0, 
"Unknown SMASI_PDU type, internal error while unpacking.");
   282     debug(
"sms.smasi", 0, 
"SMASI PDU %p dump:", (
void *) pdu);
   283     debug(
"sms.smasi", 0, 
"  type_name: %s", pdu->type_name);
   285     #define NONTERMINATED(name) p = *(&p);   286     #define COMATERMINATED(name) \   287     octstr_dump_short(p->name, 2, #name);   288     #define PDU(name, id, fields) \   289         case id: { struct name *p = &pdu->u.name; fields } break;   292         warning(0, 
"Unknown SMASI_PDU type, internal error.");
   295     debug(
"sms.smasi", 0, 
"SMASI PDU dump ends.");
 void smasi_pdu_dump(SMASI_PDU *pdu)
 
Octstr * conn_read_line(Connection *conn)
 
void error(int err, const char *fmt,...)
 
unsigned int needs_hyphen
 
static Octstr * decode_type(Octstr *os)
 
static Octstr * copy_until_coma(Octstr *os, long *pos)
 
void octstr_append_char(Octstr *ostr, int ch)
 
void octstr_append_cstr(Octstr *ostr, const char *cstr)
 
SMASI_PDU * smasi_pdu_create(unsigned long type)
 
#define octstr_get_cstr(ostr)
 
#define octstr_copy(ostr, from, len)
 
long octstr_search_char(const Octstr *ostr, int ch, long pos)
 
Octstr * smasi_pdu_pack(SMASI_PDU *pdu)
 
void octstr_insert(Octstr *ostr1, const Octstr *ostr2, long pos)
 
SMASI_PDU * smasi_pdu_unpack(Octstr *data_without_len)
 
static void skip_until_after_colon(Octstr *os, long *pos)
 
Octstr * smasi_pdu_read(Connection *conn)
 
void warning(int err, const char *fmt,...)
 
void octstr_destroy(Octstr *ostr)
 
#define octstr_create(cstr)
 
static Octstr * copy_until_assign(Octstr *os, long *pos)
 
long octstr_len(const Octstr *ostr)
 
void debug(const char *place, int err, const char *fmt,...)
 
void smasi_pdu_destroy(SMASI_PDU *pdu)