00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #define KATE_INTERNAL
00011 #include "kate_internal.h"
00012
00013 #ifdef HAVE_STDLIB_H
00014 #include <stdlib.h>
00015 #endif
00016 #include "kate/kate.h"
00017 #include "kate_decode_state.h"
00018
00019 kate_decode_state *kate_decode_state_create()
00020 {
00021 kate_decode_state *kds;
00022
00023 kds=(kate_decode_state*)kate_malloc(sizeof(kate_decode_state));
00024 if (!kds) return NULL;
00025 kds->ki=NULL;
00026 kds->kc=NULL;
00027 kds->event=NULL;
00028 kds->n_active_events=0;
00029 kds->active_events=NULL;
00030
00031 return kds;
00032 }
00033
00034 int kate_decode_state_clear(kate_decode_state *kds,const kate_info *ki,int new)
00035 {
00036 if (!kds || !ki) return KATE_E_INVALID_PARAMETER;
00037
00038 if (kds->event) {
00039 kate_event_release(kds->event);
00040 kds->event=NULL;
00041 }
00042
00043 if (new) {
00044 kds->event=kate_event_create(ki);
00045 if (!kds->event) return KATE_E_OUT_OF_MEMORY;
00046 kate_event_track(kds->event);
00047 }
00048
00049 return 0;
00050 }
00051
00052 int kate_decode_state_flush_events(kate_decode_state *kds,kate_int64_t granule)
00053 {
00054 size_t n;
00055
00056 if (!kds) return KATE_E_INVALID_PARAMETER;
00057
00058
00059 for (n=0;n<kds->n_active_events;++n) {
00060 if (granule<kds->active_events[n].start || granule>kds->active_events[n].end) {
00061 kds->active_events[n--]=kds->active_events[--kds->n_active_events];
00062 }
00063 }
00064
00065 return 0;
00066 }
00067
00068 int kate_decode_state_find_event(kate_decode_state *kds,kate_int32_t id)
00069 {
00070 size_t n;
00071
00072 if (!kds) return KATE_E_INVALID_PARAMETER;
00073 if (id<0) return KATE_E_INVALID_PARAMETER;
00074
00075 for (n=0;n<kds->n_active_events;++n) {
00076 if (kds->active_events[n].id==id) return 0;
00077 }
00078
00079 return KATE_E_NOT_FOUND;
00080 }
00081
00082 int kate_decode_state_add_event(kate_decode_state *kds,const kate_event *ev)
00083 {
00084 size_t n;
00085 kate_active_event *events;
00086 int ret;
00087
00088 if (!kds) return KATE_E_INVALID_PARAMETER;
00089 if (!ev) return KATE_E_INVALID_PARAMETER;
00090
00091 ret=kate_check_add_overflow(kds->n_active_events,1,NULL);
00092 if (ret<0) return ret;
00093
00094
00095 for (n=0;n<kds->n_active_events;++n) {
00096 if (kds->active_events[n].id==ev->id) {
00097 return 1;
00098 }
00099 }
00100
00101
00102 events=(kate_active_event*)kate_checked_realloc(kds->active_events,(kds->n_active_events+1),sizeof(kate_active_event));
00103 if (!events) return KATE_E_OUT_OF_MEMORY;
00104
00105 kds->active_events=events;
00106 kds->active_events[kds->n_active_events].id=ev->id;
00107 kds->active_events[kds->n_active_events].start=ev->start;
00108 kds->active_events[kds->n_active_events].end=ev->start+ev->duration-1;
00109 ++kds->n_active_events;
00110
00111 return 0;
00112 }
00113
00114 int kate_decode_state_destroy(kate_decode_state *kds)
00115 {
00116 if (!kds) return KATE_E_INVALID_PARAMETER;
00117
00118 kate_event_release(kds->event);
00119
00120 if (kds->ki) kate_info_clear(kds->ki);
00121 if (kds->kc) kate_comment_clear(kds->kc);
00122
00123 kate_free(kds->active_events);
00124
00125 kate_free(kds);
00126
00127 return 0;
00128 }