summaryrefslogtreecommitdiffstats
path: root/tinySIGCOMP/src/tcomp_udvm.statemanagment.c
diff options
context:
space:
mode:
Diffstat (limited to 'tinySIGCOMP/src/tcomp_udvm.statemanagment.c')
-rw-r--r--tinySIGCOMP/src/tcomp_udvm.statemanagment.c134
1 files changed, 134 insertions, 0 deletions
diff --git a/tinySIGCOMP/src/tcomp_udvm.statemanagment.c b/tinySIGCOMP/src/tcomp_udvm.statemanagment.c
new file mode 100644
index 0000000..2644c54
--- /dev/null
+++ b/tinySIGCOMP/src/tcomp_udvm.statemanagment.c
@@ -0,0 +1,134 @@
+/*
+* Copyright (C) 2010-2011 Mamadou Diop.
+*
+* Contact: Mamadou Diop <diopmamadou(at)doubango[dot]org>
+*
+* This file is part of Open Source Doubango Framework.
+*
+* DOUBANGO is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* DOUBANGO is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with DOUBANGO.
+*
+*/
+
+/**@file tcomp_udvm.statemanagment.c
+ * @brief SigComp UDVM machine (State managment)
+ *
+ * @author Mamadou Diop <diopmamadou(at)yahoo.fr>
+ *
+
+ */
+#include "tcomp_udvm.h"
+
+
+int tcomp_udvm_byteCopy_TempStates(tcomp_udvm_t *udvm)
+{
+ int ok = 1;
+ uint8_t i;
+ uint8_t tocreate_size = tcomp_result_getTempStatesToCreateSize(udvm->lpResult);
+ uint8_t tofree_size = tcomp_result_getTempStatesToFreeSize(udvm->lpResult);
+
+
+ /*
+ * State Create
+ */
+ for(i = 0; i < tocreate_size && ok; i++)
+ {
+ /*
+ * The UDVM byte copies a string of state_length bytes from the UDVM
+ * memory beginning at state_address (obeying the rules of Section 8.4).
+ * This is the state_value.
+ */
+ tcomp_state_t* lpState = udvm->lpResult->statesToCreate[i];
+ if(lpState->length){
+ tcomp_buffer_allocBuff(lpState->value, lpState->length);
+ }
+
+ ok &= tcomp_udvm_bytecopy_from(udvm, tcomp_buffer_getBuffer(lpState->value), lpState->address, lpState->length);
+ }
+
+ /*
+ * State Free
+ */
+ for(i = 0; i<tofree_size && ok; i++){
+ tcomp_tempstate_to_free_t *lpDesc = udvm->lpResult->statesToFree[i];
+ tcomp_buffer_allocBuff(lpDesc->identifier, lpDesc->partial_identifier_length);
+ ok &= tcomp_udvm_bytecopy_from(udvm, tcomp_buffer_getBuffer(lpDesc->identifier), lpDesc->partial_identifier_start, lpDesc->partial_identifier_length);
+ }
+ return ok;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+///
+/// @brief Creates temporary state.
+///
+/// @param [in,out] udvm If non-null, the udvm.
+/// @param state_length Length of the state.
+/// @param state_address The state address.
+/// @param state_instruction The state instruction.
+/// @param minimum_access_length Length of the minimum access.
+/// @param state_retention_priority The state retention priority.
+/// @param end_msg Message describing the end.
+///
+/// @return 1 if succeed an zero otherwise.
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+int tcomp_udvm_createTempState(tcomp_udvm_t *udvm, uint32_t state_length, uint32_t state_address, uint32_t state_instruction,
+ uint32_t minimum_access_length, uint32_t state_retention_priority, int end_msg)
+{
+ /*
+ * If the specified minimum_access_length does not lie between 6 and 20 inclusive, or if
+ * the state_retention_priority is 65535 then the END-MESSAGE
+ * instruction fails to make a state creation request of its own
+ * (however decompression failure does not occur and the state creation
+ * requests made by the STATE-CREATE instruction are still valid).
+ */
+ int is_ok = ( (6<=minimum_access_length && minimum_access_length<=20) && state_retention_priority!=65535 );
+
+ // if not ok and not END_MESSAGE --> decompression failure MUST occurs
+ if(!is_ok)
+ {
+ if(end_msg) return 1;
+
+ if(state_retention_priority == 65535)
+ {
+ tcomp_udvm_createNackInfo2(udvm, NACK_INVALID_STATE_PRIORITY);
+ }
+ else
+ {
+ tcomp_udvm_createNackInfo2(udvm, NACK_INVALID_STATE_ID_LENGTH);
+ }
+ return 0;
+ }
+
+ /*
+ * decompression failure occurs if the END-MESSAGE instruction makes a state creation request and four
+ * instances of the STATE-CREATE instruction have already been encountered.
+ */
+ if(tcomp_result_getTempStatesToCreateSize(udvm->lpResult) >= MAX_TEMP_SATES)
+ {
+ tcomp_udvm_createNackInfo2(udvm, NACK_TOO_MANY_STATE_REQUESTS);
+ return 0;
+ }
+
+ /*
+ * Is there a state to create?
+ */
+ if(is_ok)
+ {
+ // no byte copy ()
+ tcomp_state_t *lpState = tcomp_state_create(state_length, state_address, state_instruction, minimum_access_length, state_retention_priority);
+ tcomp_result_addTempStateToCreate(udvm->lpResult, lpState);
+ }
+
+ return 1;
+}
OpenPOWER on IntegriCloud