00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 #include "C_ProtocolContext.hpp"
00021 
00022 #include "GeneratorError.h"
00023 #include "BufferUtils.hpp"
00024 
00025 #include <cstdlib> 
00026 #include "GeneratorTrace.hpp"
00027 
00028 
00029 
00030 C_ProtocolContext::C_ProtocolContext(int P_nb_values) {
00031 
00032   m_nb_values = P_nb_values ;
00033 
00034   ALLOC_TABLE(m_ctxt_val_table, 
00035               T_pCtxtValue,
00036               sizeof(T_CtxtValue),
00037               m_nb_values);
00038 
00039   reset_ctxt_values() ;
00040 
00041   m_end_ctxt_counter = false;
00042 }
00043 
00044 
00045 void C_ProtocolContext::reset_ctxt_values(int P_index) {
00046 
00047   int L_i ;
00048 
00049   for(L_i = P_index ; L_i < m_nb_values ; L_i++) {
00050     m_ctxt_val_table[L_i].m_ctxt_value.m_type = E_TYPE_NUMBER ;
00051     m_ctxt_val_table[L_i].m_ctxt_value.m_id   = L_i ;
00052     m_ctxt_val_table[L_i].m_ctxt_value.m_value.m_val_number = 0 ;
00053     m_ctxt_val_table[L_i].m_ctxt_position.m_id_field = -1 ;
00054     m_ctxt_val_table[L_i].m_ctxt_position.m_position_ptr = NULL ;
00055   }
00056 }
00057 
00058 C_ProtocolContext::~C_ProtocolContext() {
00059   FREE_TABLE(m_ctxt_val_table);
00060   m_end_ctxt_counter = false;
00061 }
00062 
00063 
00064 void C_ProtocolContext::start_ctxt_value(int P_ctxt_id,
00065                                          int P_size) {
00066   m_ctxt_val_table[P_ctxt_id].m_ctxt_value.m_value.m_val_number = P_size ;
00067 }
00068 
00069 
00070 void C_ProtocolContext::update_ctxt_values(int P_nbCtx,
00071                                            int *P_idTable, 
00072                                            int P_size) {
00073 
00074   int L_i ;
00075 
00076   for (L_i = 0 ; L_i < P_nbCtx; L_i++) {
00077     m_ctxt_val_table[P_idTable[L_i]].m_ctxt_value.m_value.m_val_number += P_size ;
00078   }
00079 }
00080 
00081 
00082 int C_ProtocolContext::update_ctxt_values_decode(int P_nbCtx,
00083                                                  int *P_idTable, 
00084                                                  int P_size) {
00085   int L_ret = 0 ;
00086   int L_i       ;
00087 
00088   for (L_i = 0 ; L_i < P_nbCtx; L_i++) {
00089     m_ctxt_val_table[P_idTable[L_i]].m_ctxt_value.m_value.m_val_number 
00090       -= P_size ;
00091     
00092     if (m_ctxt_val_table[P_idTable[L_i]].m_ctxt_value.m_value.m_val_number 
00093         < 0) {
00094       L_ret = -1 ;
00095       break;
00096     }
00097   }
00098 
00099   return (L_ret);
00100 }
00101 
00102 
00103 void C_ProtocolContext::update_ctxt_values(int P_id,
00104                                            int P_size) {
00105   m_ctxt_val_table[P_id].m_ctxt_value.m_value.m_val_number += P_size ;
00106 }
00107 
00108 
00109 void C_ProtocolContext::update_ctxt_position(int P_id, T_pPositionValue P_position_value) {
00110   m_ctxt_val_table[P_id].m_ctxt_position.m_id_field     =  P_position_value->m_id_field;
00111   m_ctxt_val_table[P_id].m_ctxt_position.m_position_ptr = P_position_value->m_position_ptr;
00112 }
00113 
00114 
00115 unsigned long C_ProtocolContext::get_counter_ctxt(int P_ctxt_id) {
00116   return(m_ctxt_val_table[P_ctxt_id].m_ctxt_value.m_value.m_val_number);
00117 }
00118 
00119 
00120 bool C_ProtocolContext::end_counter_ctxt() {
00121 
00122   int L_i ;
00123 
00124   for (L_i=1; L_i < m_nb_values; L_i++) {
00125     m_end_ctxt_counter = (m_ctxt_val_table[L_i].m_ctxt_value.m_value.m_val_number
00126                           == 0) ;
00127     if (!m_end_ctxt_counter) break ;
00128   }
00129   return (m_end_ctxt_counter);
00130 }