Back to index

im-sdk  12.3.91
comp-annotation-value.c
Go to the documentation of this file.
00001 #include <stdlib.h>
00002 #include <string.h>
00003 #include <sys/types.h>
00004 
00005 #include <iiimp-data.h>
00006 
00007 #include "iiimp-dataP.h"
00008 
00009 
00010 static IIIMP_annotation_value *
00011 iiimp_annotation_value_new(
00012     IIIMP_data_s *   data_s,
00013     IIIMP_int32             start_index,
00014     IIIMP_int32             end_index,
00015     IIIMP_text *     ptr_text,
00016     IIIMP_string *   ptr_str)
00017 {
00018     IIIMP_annotation_value *       anno_v;
00019 
00020     anno_v = (IIIMP_annotation_value *)malloc(sizeof (IIIMP_annotation_value));
00021     if (NULL == anno_v) {
00022        data_s->status = IIIMP_DATA_MALLOC_ERROR;
00023        return NULL;
00024     }
00025 
00026     anno_v->nbyte = (4 + 4 + 4);
00027     anno_v->next = NULL;
00028 
00029     anno_v->start_index = start_index;
00030     anno_v->end_index = end_index;
00031 
00032     if (NULL != ptr_str) {
00033        anno_v->length = ptr_str->nbyte;
00034        anno_v->nbyte += ptr_str->nbyte;
00035        anno_v->v.string = ptr_str;
00036     } else if (NULL != ptr_text) {
00037        anno_v->length = ptr_text->nbyte;
00038        anno_v->nbyte += ptr_text->nbyte;
00039        anno_v->v.text = ptr_text;
00040     } else {
00041        free(anno_v);
00042        data_s->status = IIIMP_DATA_INVALID;
00043        return NULL;
00044     }
00045 
00046     return anno_v;
00047 }
00048 
00049 
00050 IIIMP_annotation_value *
00051 iiimp_annotation_value_text_new(
00052     IIIMP_data_s *   data_s,
00053     IIIMP_int32             start_index,
00054     IIIMP_int32             end_index,
00055     IIIMP_text *     value)
00056 {
00057     return iiimp_annotation_value_new(data_s, start_index, end_index,
00058                                   value, NULL);
00059 }
00060 
00061 
00062 void
00063 iiimp_annotation_text_delete(
00064     IIIMP_data_s *          data_s,
00065     IIIMP_annotation_value *       anno_v)
00066 {
00067     IIIMP_annotation_value *       anno_next;
00068     for (; NULL != anno_v; anno_v = anno_next) {
00069        anno_next = anno_v->next;
00070        iiimp_text_delete(data_s, anno_v->v.text);
00071        free(anno_v);
00072     }
00073     return;
00074 }
00075 
00076 
00077 IIIMP_annotation_value *
00078 iiimp_annotation_value_string_new(
00079     IIIMP_data_s *   data_s,
00080     IIIMP_int32             start_index,
00081     IIIMP_int32             end_index,
00082     IIIMP_string *   value)
00083 {
00084     return iiimp_annotation_value_new(data_s, start_index, end_index,
00085                                   NULL, value);
00086 }
00087 
00088 
00089 void
00090 iiimp_annotation_string_delete(
00091     IIIMP_data_s *          data_s,
00092     IIIMP_annotation_value *       anno_v)
00093 {
00094     IIIMP_annotation_value *       anno_next;
00095 
00096     for (; NULL != anno_v; anno_v = anno_next) {
00097        anno_next = anno_v->next;
00098        iiimp_string_list_delete(data_s, anno_v->v.string);
00099        free(anno_v);
00100     }
00101 
00102     return;
00103 }
00104 
00105 
00106 void
00107 iiimp_annotation_text_pack(
00108     IIIMP_data_s *          data_s,
00109     IIIMP_annotation_value *       m,
00110     size_t *                nbyte,
00111     uchar_t **                     ptr)
00112 {
00113     size_t                  rest;
00114     uchar_t *               p;
00115     IIIMP_annotation_value *       v;
00116     size_t                  length;
00117 
00118     rest = *nbyte;
00119     p = *ptr;
00120 
00121     length = 0;
00122     for (v = m; NULL != v; v = v->next) {
00123        length += (4 + 4 + 4 + v->v.text->nbyte);
00124     }
00125     PUTU32(length, rest, p, data_s->byte_swap);
00126 
00127     for (; NULL != m; m = m->next) {
00128        PUT32(m->start_index, rest, p, data_s->byte_swap);
00129        PUT32(m->end_index, rest, p, data_s->byte_swap);
00130        PUT32(m->length, rest, p, data_s->byte_swap);
00131        iiimp_text_pack(data_s, m->v.text, &rest, &p);
00132     }
00133 
00134     *nbyte = rest;
00135     *ptr = p;
00136 
00137     return;
00138 }
00139 
00140 
00141 void
00142 iiimp_annotation_string_pack(
00143     IIIMP_data_s *          data_s,
00144     IIIMP_annotation_value *       m,
00145     size_t *                nbyte,
00146     uchar_t **                     ptr)
00147 {
00148     size_t                  rest;
00149     uchar_t *               p;
00150     IIIMP_annotation_value *       v;
00151     size_t                  length;
00152 
00153     rest = *nbyte;
00154     p = *ptr;
00155 
00156     length = 0;
00157     for (v = m; NULL != v; v = v->next) {
00158        length += (4 + 4 + 4 + v->v.string->nbyte);
00159     }
00160     PUTU32(length, rest, p, data_s->byte_swap);
00161 
00162     for (; NULL != m; m = m->next) {
00163        PUT32(m->start_index, rest, p, data_s->byte_swap);
00164        PUT32(m->end_index, rest, p, data_s->byte_swap);
00165        PUT32(m->length, rest, p, data_s->byte_swap);
00166        iiimp_string_pack(data_s, m->v.string, &rest, &p);
00167     }
00168 
00169     *nbyte = rest;
00170     *ptr = p;
00171 
00172     return;
00173 }
00174 
00175 
00176 IIIMP_annotation_value *
00177 iiimp_annotation_text_unpack(
00178     IIIMP_data_s *   data_s,
00179     size_t *         nbyte,
00180     const uchar_t ** ptr,
00181     size_t           nbyte_max)
00182 {
00183     IIIMP_annotation_value *       anno_v;
00184     size_t                  rest;
00185     const uchar_t *         p;
00186     IIIMP_annotation_value *       anno_v_first;
00187     IIIMP_annotation_value *       anno_v_last = NULL;
00188 
00189     rest = nbyte_max;
00190     p = *ptr;
00191 
00192     anno_v_first = NULL;
00193     while (0 < rest) {
00194        if ((*nbyte < rest) || (rest < (4 + 4 + 4))) {
00195            iiimp_annotation_text_delete(data_s, anno_v_first);
00196            data_s->status = IIIMP_DATA_INVALID;
00197            return NULL;
00198        }
00199 
00200        anno_v = (IIIMP_annotation_value *)
00201            malloc(sizeof (IIIMP_annotation_value));
00202        if (NULL == anno_v) {
00203            iiimp_annotation_text_delete(data_s, anno_v_first);
00204            data_s->status = IIIMP_DATA_MALLOC_ERROR;
00205            return NULL;
00206        }
00207 
00208        anno_v->next = NULL;
00209        GET32(anno_v->start_index, rest, p, data_s->byte_swap);
00210        GET32(anno_v->end_index, rest, p, data_s->byte_swap);
00211        GET32(anno_v->length, rest, p, data_s->byte_swap);
00212        if (anno_v->length < rest) {
00213            iiimp_annotation_text_delete(data_s, anno_v_first);
00214            data_s->status = IIIMP_DATA_INVALID;
00215            return NULL;
00216        }
00217        anno_v->v.text = iiimp_text_unpack(data_s, &rest, &p, anno_v->length);
00218        if (NULL == anno_v->v.text) {
00219            iiimp_annotation_text_delete(data_s, anno_v_first);
00220            return NULL;
00221        }
00222 
00223        if (NULL == anno_v_first) {
00224            anno_v_first = anno_v;
00225            anno_v_last = anno_v;
00226        } else {
00227            anno_v_last->next = anno_v;
00228            anno_v_last = anno_v;
00229        }
00230     }
00231 
00232     *nbyte = rest;
00233     *ptr = p;
00234 
00235     return anno_v_first;
00236 }
00237 
00238 
00239 IIIMP_annotation_value *
00240 iiimp_annotation_string_unpack(
00241     IIIMP_data_s *   data_s,
00242     size_t *         nbyte,
00243     const uchar_t ** ptr,
00244     size_t           nbyte_max)
00245 {
00246     IIIMP_annotation_value *       anno_v;
00247     size_t                  rest;
00248     const uchar_t *         p;
00249     IIIMP_annotation_value *       anno_v_first;
00250     IIIMP_annotation_value *       anno_v_last = NULL;
00251 
00252     rest = nbyte_max;
00253     p = *ptr;
00254 
00255     anno_v_first = NULL;
00256     while (0 < rest) {
00257        if (rest < (4 + 4 + 4)) {
00258            data_s->status = IIIMP_DATA_INVALID;
00259            return NULL;
00260        }
00261        anno_v = (IIIMP_annotation_value *)
00262            malloc(sizeof (IIIMP_annotation_value));
00263        if (NULL == anno_v) {
00264            iiimp_annotation_string_delete(data_s, anno_v_first);
00265            data_s->status = IIIMP_DATA_MALLOC_ERROR;
00266            return NULL;
00267        }
00268 
00269        anno_v->next = NULL;
00270        GET32(anno_v->start_index, rest, p, data_s->byte_swap);
00271        GET32(anno_v->end_index, rest, p, data_s->byte_swap);
00272        GET32(anno_v->length, rest, p, data_s->byte_swap);
00273        if (anno_v->length < rest) {
00274            iiimp_annotation_string_delete(data_s, anno_v_first);
00275            data_s->status = IIIMP_DATA_INVALID;
00276            return NULL;
00277        }
00278        anno_v->v.string = iiimp_string_unpack(data_s, &rest, &p,
00279                                           anno_v->length);
00280        if (NULL == anno_v->v.string) {
00281            iiimp_annotation_string_delete(data_s, anno_v_first);
00282            return NULL;
00283        }
00284        if (NULL == anno_v_first) {
00285            anno_v_first = anno_v;
00286            anno_v_last = anno_v;
00287        } else {
00288            anno_v_last->next = anno_v;
00289            anno_v_last = anno_v;
00290        }
00291     }
00292 
00293     *nbyte = rest;
00294     *ptr = p;
00295 
00296     return anno_v_first;
00297 }
00298 
00299 
00300 /* Local Variables: */
00301 /* c-file-style: "iiim-project" */
00302 /* End: */