xref: /trunk/main/sal/rtl/source/tres.c (revision 922709c981a892574cf33806b25c024a3e6c51ed)
1647f063dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3647f063dSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4647f063dSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5647f063dSAndrew Rist  * distributed with this work for additional information
6647f063dSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7647f063dSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8647f063dSAndrew Rist  * "License"); you may not use this file except in compliance
9647f063dSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11647f063dSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13647f063dSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14647f063dSAndrew Rist  * software distributed under the License is distributed on an
15647f063dSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16647f063dSAndrew Rist  * KIND, either express or implied.  See the License for the
17647f063dSAndrew Rist  * specific language governing permissions and limitations
18647f063dSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20647f063dSAndrew Rist  *************************************************************/
21647f063dSAndrew Rist 
22cdf0e10cSrcweir #include <stdio.h>
23cdf0e10cSrcweir #include <rtl/tres.h>
24cdf0e10cSrcweir #include <osl/diagnose.h>
25cdf0e10cSrcweir #include <osl/time.h>
26cdf0e10cSrcweir 
27cdf0e10cSrcweir  /* force an assertion on false state */
28cdf0e10cSrcweir #define TST_BOOM(c, m)  OSL_ENSURE(c, m)
29cdf0e10cSrcweir 
30cdf0e10cSrcweir 
31cdf0e10cSrcweir typedef struct _rtl_CmpState
32cdf0e10cSrcweir {
33cdf0e10cSrcweir     struct _rtl_CmpState*   m_next;
34cdf0e10cSrcweir     struct _rtl_CmpState*   m_prev;
35cdf0e10cSrcweir 
36cdf0e10cSrcweir     sal_Bool                m_stat;
37cdf0e10cSrcweir     rtl_String*             m_msg;
38cdf0e10cSrcweir 
39cdf0e10cSrcweir } rtl_CmpState;
40cdf0e10cSrcweir 
41cdf0e10cSrcweir typedef struct _rtl_FuncState
42cdf0e10cSrcweir {
43cdf0e10cSrcweir     struct _rtl_FuncState*  m_next;
44cdf0e10cSrcweir     struct _rtl_FuncState*  m_prev;
45cdf0e10cSrcweir     rtl_String*             m_name;
46cdf0e10cSrcweir     sal_uInt32              m_flags;
47cdf0e10cSrcweir     sal_uInt32              m_start;
48cdf0e10cSrcweir     sal_uInt32              m_stop;
49cdf0e10cSrcweir     struct _rtl_CmpState*   m_cmp;
50cdf0e10cSrcweir 
51cdf0e10cSrcweir } rtl_FuncState;
52cdf0e10cSrcweir 
53cdf0e10cSrcweir 
54cdf0e10cSrcweir 
55cdf0e10cSrcweir typedef struct _rtl_TestResult_Data
56cdf0e10cSrcweir {
57cdf0e10cSrcweir     rtl_TestResult_vtable*  m_funcs;
58cdf0e10cSrcweir     void*                   m_externaldata;
59cdf0e10cSrcweir 
60cdf0e10cSrcweir     rtl_FuncState*   m_state;
61cdf0e10cSrcweir 
62cdf0e10cSrcweir } rtl_TestResult_Data;
63cdf0e10cSrcweir 
64cdf0e10cSrcweir 
65cdf0e10cSrcweir  /**
66cdf0e10cSrcweir   * internal helper functions
67cdf0e10cSrcweir   */
68cdf0e10cSrcweir 
69cdf0e10cSrcweir  /* ...to create, link, unlink and destroy allocated memory */
70cdf0e10cSrcweir rtl_FuncState* SAL_CALL rtl_tres_create_funcstate( const sal_Char* meth );
71cdf0e10cSrcweir rtl_FuncState* SAL_CALL rtl_tres_link_funcstate( rtl_FuncState* ptr,
72cdf0e10cSrcweir                                                     rtl_FuncState* plink );
73cdf0e10cSrcweir rtl_FuncState* SAL_CALL rtl_tres_unlink_funcstate( rtl_FuncState* plink );
74cdf0e10cSrcweir rtl_CmpState* SAL_CALL rtl_tres_create_cmpstate(
75cdf0e10cSrcweir                                                 sal_Bool state,
76cdf0e10cSrcweir                                                 const sal_Char* msg
77cdf0e10cSrcweir                                                 );
78cdf0e10cSrcweir rtl_CmpState* SAL_CALL rtl_tres_link_cmpstate( rtl_CmpState* ptr,
79cdf0e10cSrcweir                                                     rtl_CmpState* plink );
80cdf0e10cSrcweir rtl_CmpState* SAL_CALL rtl_tres_unlink_cmpstate( rtl_CmpState* plink );
81cdf0e10cSrcweir sal_uInt32 SAL_CALL rtl_tres_timer();
82cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_funcstate( rtl_FuncState* pState_ );
83cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_funcstates( rtl_FuncState* pState_ );
84cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_cmpstates( rtl_CmpState* pState_ );
85cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_cmpstate( rtl_CmpState* pState_ );
86cdf0e10cSrcweir 
87cdf0e10cSrcweir 
88cdf0e10cSrcweir  /* set and clear single bits */
89cdf0e10cSrcweir static void SAL_CALL rtl_tres_setbit( rtl_FuncState* pState_,
90cdf0e10cSrcweir                                                           sal_uInt32 flag  );
91cdf0e10cSrcweir static void SAL_CALL rtl_tres_clearbit( rtl_FuncState* pState_,
92cdf0e10cSrcweir                                                           sal_uInt32 flag  );
93cdf0e10cSrcweir 
94cdf0e10cSrcweir  /**
95cdf0e10cSrcweir   * forward declarations of concrete function implementations overloadable
96cdf0e10cSrcweir   * and accessible via vtable
97cdf0e10cSrcweir   */
98cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_state(
99cdf0e10cSrcweir                                         rtl_TestResult* pThis_,
100cdf0e10cSrcweir                                         sal_Bool state,
101cdf0e10cSrcweir                                         const sal_Char* msg,
102cdf0e10cSrcweir                                         const sal_Char* sub,
103cdf0e10cSrcweir                                         sal_Bool v
104cdf0e10cSrcweir                                         );
105cdf0e10cSrcweir 
106cdf0e10cSrcweir static void SAL_CALL rtl_tres_end( rtl_TestResult* pThis_,
107cdf0e10cSrcweir                                                         const sal_Char* msg );
108cdf0e10cSrcweir 
109cdf0e10cSrcweir static rtl_funcstate SAL_CALL rtl_tres_funcstate( rtl_TestResult* pThis_ );
110cdf0e10cSrcweir 
111cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_ispassed( rtl_TestResult* pThis_ );
112cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_isok( rtl_TestResult* pThis_ );
113cdf0e10cSrcweir 
114cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_isbit( rtl_TestResult* pThis_,
115cdf0e10cSrcweir                                                         sal_uInt32 flag );
116cdf0e10cSrcweir 
117cdf0e10cSrcweir static rtl_funcstate SAL_CALL rtl_tres_getnextfuncstate( rtl_funcstate );
118cdf0e10cSrcweir static rtl_funcstate SAL_CALL rtl_tres_getprevfuncstate( rtl_funcstate );
119cdf0e10cSrcweir static sal_uInt32 SAL_CALL rtl_tres_getflags( rtl_funcstate );
120cdf0e10cSrcweir sal_uInt32 SAL_CALL rtl_tres_getstarttime( rtl_funcstate );
121cdf0e10cSrcweir sal_uInt32 SAL_CALL rtl_tres_getstoptime( rtl_funcstate );
122cdf0e10cSrcweir static rtl_cmpstate SAL_CALL rtl_tres_getcmpstate( rtl_funcstate );
123cdf0e10cSrcweir 
124cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_getstat( rtl_cmpstate );
125cdf0e10cSrcweir rtl_String* SAL_CALL rtl_tres_getname( rtl_funcstate );
126cdf0e10cSrcweir rtl_String* SAL_CALL rtl_tres_getmsg( rtl_cmpstate );
127cdf0e10cSrcweir static rtl_cmpstate SAL_CALL rtl_tres_getnextcmpstate( rtl_cmpstate );
128cdf0e10cSrcweir 
129cdf0e10cSrcweir 
130cdf0e10cSrcweir  /**
131cdf0e10cSrcweir  * initialize vtable with function pointers
132cdf0e10cSrcweir  */
133cdf0e10cSrcweir static rtl_TestResult_vtable trVTable =
134cdf0e10cSrcweir {
135cdf0e10cSrcweir     sizeof(rtl_TestResult_vtable),
136cdf0e10cSrcweir     rtl_tres_state,
137cdf0e10cSrcweir     rtl_tres_end,
138cdf0e10cSrcweir     rtl_tres_ispassed,
139cdf0e10cSrcweir     rtl_tres_isok,
140cdf0e10cSrcweir     rtl_tres_funcstate,
141cdf0e10cSrcweir     rtl_tres_isbit,
142cdf0e10cSrcweir     rtl_tres_getnextfuncstate,
143cdf0e10cSrcweir     rtl_tres_getprevfuncstate,
144cdf0e10cSrcweir     rtl_tres_getflags,
145cdf0e10cSrcweir     rtl_tres_getname,
146cdf0e10cSrcweir     rtl_tres_getstarttime,
147cdf0e10cSrcweir     rtl_tres_getstoptime,
148cdf0e10cSrcweir     rtl_tres_getcmpstate,
149cdf0e10cSrcweir     rtl_tres_getstat,
150cdf0e10cSrcweir     rtl_tres_getmsg,
151cdf0e10cSrcweir     rtl_tres_getnextcmpstate
152cdf0e10cSrcweir };
153cdf0e10cSrcweir 
154cdf0e10cSrcweir  /**
155cdf0e10cSrcweir   * rtl_tres_create
156cdf0e10cSrcweir   * create and initialize data struct for TestResult
157cdf0e10cSrcweir   *
158cdf0e10cSrcweir   * @param const sal_Char* meth = name of the method (entryname)
159*922709c9Smseidel   * @param sal_uInt32 flags     = bitmap of commandline and status flags
160cdf0e10cSrcweir   *
161cdf0e10cSrcweir   * @return rtl_TestResult*     = pointer to a new allocated testresult struct
162cdf0e10cSrcweir   */
rtl_tres_create(const sal_Char * meth,sal_uInt32 flags)163cdf0e10cSrcweir rtl_TestResult* rtl_tres_create( const sal_Char* meth, sal_uInt32 flags )
164cdf0e10cSrcweir {
165cdf0e10cSrcweir     /* allocate memory for testresult data structure */
166cdf0e10cSrcweir     rtl_TestResult_Data* pData = (rtl_TestResult_Data*) malloc( sizeof(
167cdf0e10cSrcweir                                                     rtl_TestResult_Data ) );
168cdf0e10cSrcweir     /* initialize members... */
169cdf0e10cSrcweir     pData->m_funcs              = &trVTable;    /* ...vtableptr to vtbladr */
170509a48ffSpfg     pData->m_externaldata       = NULL;            /* ...external data pointer */
171cdf0e10cSrcweir 
172cdf0e10cSrcweir     /* allocate memory for state structure and initialize members */
173cdf0e10cSrcweir     pData->m_state              = rtl_tres_create_funcstate( meth );
174cdf0e10cSrcweir     pData->m_state->m_flags     = flags;        /* ...option Bitmap */
175cdf0e10cSrcweir 
176cdf0e10cSrcweir     /* set OK flag initial */
177cdf0e10cSrcweir     rtl_tres_setbit( pData->m_state, rtl_tres_Flag_OK );
178cdf0e10cSrcweir 
179cdf0e10cSrcweir     return (rtl_TestResult*)pData ;
180cdf0e10cSrcweir }
181cdf0e10cSrcweir 
182cdf0e10cSrcweir /**
183cdf0e10cSrcweir  * rtl_tres_create_funcstate
184cdf0e10cSrcweir  * allocates and initializes a structure to represent the status of a test
185cdf0e10cSrcweir  * entry or its substates
186cdf0e10cSrcweir  *
187cdf0e10cSrcweir  * @param const sal_Char* meth = the name of the method (entry or sub entry)
188cdf0e10cSrcweir  *
189cdf0e10cSrcweir  * @return rtl_FuncState* = pointer to a new allocated funcstate struct
190cdf0e10cSrcweir  */
rtl_tres_create_funcstate(const sal_Char * meth)191cdf0e10cSrcweir rtl_FuncState* SAL_CALL rtl_tres_create_funcstate( const sal_Char* meth )
192cdf0e10cSrcweir {
193509a48ffSpfg     rtl_FuncState* pStat = NULL;                   /* status structure */
194cdf0e10cSrcweir 
195cdf0e10cSrcweir     /* allocate memory for status structure */
196cdf0e10cSrcweir     pStat = (rtl_FuncState*) malloc( sizeof( struct _rtl_FuncState ) );
197cdf0e10cSrcweir 
198cdf0e10cSrcweir     if ( pStat )
199cdf0e10cSrcweir     {
200cdf0e10cSrcweir         pStat->m_next  = pStat;                 /* init ptr to next struct */
201cdf0e10cSrcweir         pStat->m_prev  = pStat;                 /* init ptr to prev struct */
202cdf0e10cSrcweir 
203509a48ffSpfg         pStat->m_name  = NULL;                     /* init name */
204cdf0e10cSrcweir         pStat->m_flags = 0;                     /* init flags */
205cdf0e10cSrcweir         pStat->m_start = rtl_tres_timer();      /* init start milliseconds */
206cdf0e10cSrcweir         pStat->m_stop  = 0;                     /* init stop milliseconds */
207509a48ffSpfg         pStat->m_cmp   = NULL;                     /* init ptr to msg struct */
208cdf0e10cSrcweir         rtl_string_newFromStr( &pStat->m_name, meth );/* copy meth to name */
209cdf0e10cSrcweir 
210cdf0e10cSrcweir         /* set ok flag initially */
211cdf0e10cSrcweir         rtl_tres_setbit(pStat, rtl_tres_Flag_OK);
212cdf0e10cSrcweir     }
213cdf0e10cSrcweir 
214cdf0e10cSrcweir     return ( pStat );
215cdf0e10cSrcweir }
216cdf0e10cSrcweir  /**
217cdf0e10cSrcweir   * rtl_tres_link_funcstate
218cdf0e10cSrcweir   * link initialized funcstate structure to a circular double linked list
219cdf0e10cSrcweir   *
220cdf0e10cSrcweir   * @param rtl_FuncState* ptr   = pointer to a funcstate where to link in new
221cdf0e10cSrcweir   * @param rtl_FuncState* plink = pointer to a funcstate to link in list
222cdf0e10cSrcweir   *
223cdf0e10cSrcweir   * @return rtl_FuncState*      = pointer to structure linked in new
224cdf0e10cSrcweir   */
rtl_tres_link_funcstate(rtl_FuncState * ptr,rtl_FuncState * plink)225cdf0e10cSrcweir rtl_FuncState* SAL_CALL rtl_tres_link_funcstate( rtl_FuncState* ptr,
226cdf0e10cSrcweir                                                         rtl_FuncState* plink )
227cdf0e10cSrcweir {
228cdf0e10cSrcweir     ptr->m_next->m_prev = plink;
229cdf0e10cSrcweir     ptr->m_next->m_prev->m_next = ptr->m_next;
230cdf0e10cSrcweir     ptr->m_next->m_prev->m_prev = ptr;
231cdf0e10cSrcweir     ptr->m_next = plink;
232cdf0e10cSrcweir     return ( plink );
233cdf0e10cSrcweir }
234cdf0e10cSrcweir 
235cdf0e10cSrcweir  /**
236cdf0e10cSrcweir   * rtl_tres_unlink_funcstate
237cdf0e10cSrcweir   * unlink funcstate structure from a circular double linked list
238cdf0e10cSrcweir   *
239cdf0e10cSrcweir   * @param rtl_FuncState* plink = pointer to a funcstate to unlink from list
240cdf0e10cSrcweir   *
241cdf0e10cSrcweir   * @return rtl_FuncState*      = pointer to funcstate struct unlinked from
242cdf0e10cSrcweir   *                               list
243cdf0e10cSrcweir   */
rtl_tres_unlink_funcstate(rtl_FuncState * plink)244cdf0e10cSrcweir rtl_FuncState* SAL_CALL rtl_tres_unlink_funcstate( rtl_FuncState* plink )
245cdf0e10cSrcweir {
246cdf0e10cSrcweir     plink->m_next->m_prev = plink->m_prev;
247cdf0e10cSrcweir     plink->m_prev->m_next = plink->m_next;
248cdf0e10cSrcweir     plink->m_next = plink;
249cdf0e10cSrcweir     plink->m_prev = plink;
250cdf0e10cSrcweir     return ( plink );
251cdf0e10cSrcweir }
252cdf0e10cSrcweir 
253cdf0e10cSrcweir  /**
254cdf0e10cSrcweir   * rtl_tres_link_cmpstate
255cdf0e10cSrcweir   * link initialized cmpstate structure to a circular double linked list
256cdf0e10cSrcweir   *
257cdf0e10cSrcweir   * @param rtl_CmpState* ptr   = pointer to a cmpstate where to link in new
258cdf0e10cSrcweir   * @param rtl_CmpState* plink = pointer to a cmpstate to link in list
259cdf0e10cSrcweir   *
260cdf0e10cSrcweir   * @return rtl_CmpState*      = pointer to cmpstate struct linked in new
261cdf0e10cSrcweir   */
rtl_tres_link_cmpstate(rtl_CmpState * ptr,rtl_CmpState * plink)262cdf0e10cSrcweir rtl_CmpState* SAL_CALL rtl_tres_link_cmpstate( rtl_CmpState* ptr,
263cdf0e10cSrcweir                                                         rtl_CmpState* plink )
264cdf0e10cSrcweir {
265cdf0e10cSrcweir     ptr->m_next->m_prev = plink;
266cdf0e10cSrcweir     ptr->m_next->m_prev->m_next = ptr->m_next;
267cdf0e10cSrcweir     ptr->m_next->m_prev->m_prev = ptr;
268cdf0e10cSrcweir     ptr->m_next = plink;
269cdf0e10cSrcweir     return ( plink );
270cdf0e10cSrcweir }
271cdf0e10cSrcweir  /**
272cdf0e10cSrcweir   * rtl_tres_unlink_cmpstate
273cdf0e10cSrcweir   * unlink cmpstate structure from a circular double linked list
274cdf0e10cSrcweir   *
275cdf0e10cSrcweir   * @param rtl_CmpState* plink = pointer to a cmpstate to unlink from list
276cdf0e10cSrcweir   *
277cdf0e10cSrcweir   * @return rtl_CmpState*      = pointer to cmpstate struct unlinked from list
278cdf0e10cSrcweir   */
rtl_tres_unlink_cmpstate(rtl_CmpState * plink)279cdf0e10cSrcweir rtl_CmpState* SAL_CALL rtl_tres_unlink_cmpstate( rtl_CmpState* plink )
280cdf0e10cSrcweir {
281cdf0e10cSrcweir     plink->m_next->m_prev = plink->m_prev;
282cdf0e10cSrcweir     plink->m_prev->m_next = plink->m_next;
283cdf0e10cSrcweir     plink->m_next = plink;
284cdf0e10cSrcweir     plink->m_prev = plink;
285cdf0e10cSrcweir     return ( plink );
286cdf0e10cSrcweir }
287cdf0e10cSrcweir 
288cdf0e10cSrcweir  /**
289cdf0e10cSrcweir   * rtl_tres_create_cmpstate
290cdf0e10cSrcweir   * allocates and initializes a structure to represent the status of a test
291cdf0e10cSrcweir   * comparison
292cdf0e10cSrcweir   *
293cdf0e10cSrcweir   * @param sal_Bool state   = compare state
294cdf0e10cSrcweir   * @param sal_Char* msg    = message for logging and debug purposes
295cdf0e10cSrcweir   *
296cdf0e10cSrcweir   * @return rtl_CmpState*   = pointer to the new allocated struct
297cdf0e10cSrcweir   */
rtl_tres_create_cmpstate(sal_Bool state,const sal_Char * msg)298cdf0e10cSrcweir rtl_CmpState* SAL_CALL rtl_tres_create_cmpstate(
299cdf0e10cSrcweir                                                 sal_Bool state,
300cdf0e10cSrcweir                                                 const sal_Char* msg
301cdf0e10cSrcweir                                                 )
302cdf0e10cSrcweir {
303cdf0e10cSrcweir     /* allocate memory for cmpstate struct */
304cdf0e10cSrcweir     rtl_CmpState* pStat = (rtl_CmpState*) malloc( sizeof( rtl_CmpState ) );
305cdf0e10cSrcweir 
306cdf0e10cSrcweir     /* initialize if memory could be allocated */
307cdf0e10cSrcweir     if ( pStat )
308cdf0e10cSrcweir     {
309cdf0e10cSrcweir         pStat->m_next   = pStat;                /* init next with this */
310cdf0e10cSrcweir         pStat->m_prev   = pStat;                /* init prev with this */
311509a48ffSpfg         pStat->m_msg    = NULL;
312cdf0e10cSrcweir         pStat->m_stat   = state;                /* boolean state */
313cdf0e10cSrcweir         rtl_string_newFromStr( &pStat->m_msg, msg ); /* copy message */
314cdf0e10cSrcweir     }
315cdf0e10cSrcweir     return ( pStat );
316cdf0e10cSrcweir }
317cdf0e10cSrcweir 
318cdf0e10cSrcweir  /**
319cdf0e10cSrcweir   * rtl_tres_destroy
320cdf0e10cSrcweir   * free allocated memory of testresult data struct
321cdf0e10cSrcweir   *
322*922709c9Smseidel   * @param rtl_TestResult* pThis_ = pointer to a valid testresult struct
323cdf0e10cSrcweir   */
rtl_tres_destroy(rtl_TestResult * pThis_)324cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy( rtl_TestResult* pThis_ )
325cdf0e10cSrcweir {
326cdf0e10cSrcweir     /* cast to implementation representation structure */
327cdf0e10cSrcweir     rtl_TestResult_Data* pData = (rtl_TestResult_Data*) pThis_;
328cdf0e10cSrcweir 
329cdf0e10cSrcweir     /* destroy all funcstates */
330cdf0e10cSrcweir     if ( pData->m_state )
331cdf0e10cSrcweir         rtl_tres_destroy_funcstates( pData->m_state );
332cdf0e10cSrcweir 
333*922709c9Smseidel     /* free allocated memory and reinitialize to zero */
334cdf0e10cSrcweir     /* to be able to prevent dangling pointer access*/
335509a48ffSpfg     free( pData ); pData = NULL;
336cdf0e10cSrcweir }
337cdf0e10cSrcweir 
338cdf0e10cSrcweir  /**
339cdf0e10cSrcweir   * rtl_tres_destroy_funcstates
340cdf0e10cSrcweir   * free allocated memory occupied by the list of funcstate data structs
341cdf0e10cSrcweir   * (iterates through next pointers)
342cdf0e10cSrcweir   *
343cdf0e10cSrcweir   * @param rtl_FuncState* pState_ = pointer to a valid funcstate struct
344cdf0e10cSrcweir   */
rtl_tres_destroy_funcstates(rtl_FuncState * pState_)345cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_funcstates( rtl_FuncState* pState_ )
346cdf0e10cSrcweir {
347cdf0e10cSrcweir     rtl_FuncState* plink = pState_->m_next;
348cdf0e10cSrcweir     while ( plink != plink->m_next )
349cdf0e10cSrcweir     {
350cdf0e10cSrcweir         rtl_tres_destroy_funcstate( rtl_tres_unlink_funcstate( plink ) );
351cdf0e10cSrcweir         plink = pState_->m_next;
352cdf0e10cSrcweir     }
353cdf0e10cSrcweir     rtl_tres_destroy_funcstate( plink );
354cdf0e10cSrcweir }
355cdf0e10cSrcweir 
356cdf0e10cSrcweir  /**
357cdf0e10cSrcweir   * rtl_tres_destroy_cmpstates
358cdf0e10cSrcweir   * free allocated memory occupied by the list of cmpstate data structs
359cdf0e10cSrcweir   * (iterates through next pointers)
360cdf0e10cSrcweir   *
361cdf0e10cSrcweir   * @param rtl_CmpState* pState_ = pointer to a valid cmpstate struct
362cdf0e10cSrcweir   */
rtl_tres_destroy_cmpstates(rtl_CmpState * pState_)363cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_cmpstates( rtl_CmpState* pState_ )
364cdf0e10cSrcweir {
365cdf0e10cSrcweir     rtl_CmpState* plink = pState_->m_next;
366cdf0e10cSrcweir     while ( plink != plink->m_next )
367cdf0e10cSrcweir     {
368cdf0e10cSrcweir         rtl_tres_destroy_cmpstate( rtl_tres_unlink_cmpstate( plink ) );
369cdf0e10cSrcweir         plink = pState_->m_next;
370cdf0e10cSrcweir     }
371cdf0e10cSrcweir     rtl_tres_destroy_cmpstate( plink );
372cdf0e10cSrcweir }
373cdf0e10cSrcweir 
374cdf0e10cSrcweir 
375cdf0e10cSrcweir  /**
376cdf0e10cSrcweir   * rtl_tres_destroy_funcstate
377cdf0e10cSrcweir   * free allocated memory occupied by one funcstate and it's list
378cdf0e10cSrcweir   * of cmpstate data structs
379cdf0e10cSrcweir   *
380cdf0e10cSrcweir   * @param rtl_FuncState* pState_ = pointer to a valid funcstate struct
381cdf0e10cSrcweir   */
rtl_tres_destroy_funcstate(rtl_FuncState * pState_)382cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_funcstate( rtl_FuncState* pState_ )
383cdf0e10cSrcweir {
384cdf0e10cSrcweir     rtl_FuncState* plink = pState_;
385cdf0e10cSrcweir 
386cdf0e10cSrcweir     if ( plink->m_cmp )
387cdf0e10cSrcweir         rtl_tres_destroy_cmpstates( plink->m_cmp );
388cdf0e10cSrcweir 
389cdf0e10cSrcweir     if ( plink->m_name )
390cdf0e10cSrcweir     {
391cdf0e10cSrcweir         rtl_string_release( plink->m_name );
392509a48ffSpfg         plink->m_name = NULL;
393cdf0e10cSrcweir     }
394cdf0e10cSrcweir     plink->m_flags = 0;
395cdf0e10cSrcweir     free( plink );
396509a48ffSpfg     plink = NULL;
397cdf0e10cSrcweir }
398cdf0e10cSrcweir 
399cdf0e10cSrcweir  /**
400cdf0e10cSrcweir   * rtl_tres_destroy_cmpstate
401cdf0e10cSrcweir   * free allocated memory of a cmpstate data struct
402cdf0e10cSrcweir   *
403cdf0e10cSrcweir   * @param rtl_CmpState* pState_ = pointer to cmpstate struct to destroy
404cdf0e10cSrcweir   */
rtl_tres_destroy_cmpstate(rtl_CmpState * pState_)405cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_cmpstate( rtl_CmpState* pState_ )
406cdf0e10cSrcweir {
407cdf0e10cSrcweir 
408cdf0e10cSrcweir     rtl_CmpState* plink = pState_;
409cdf0e10cSrcweir 
410cdf0e10cSrcweir     if ( plink->m_msg )
411cdf0e10cSrcweir     {
412cdf0e10cSrcweir         rtl_string_release( plink->m_msg );
413509a48ffSpfg         plink->m_msg = NULL;
414cdf0e10cSrcweir     }
415cdf0e10cSrcweir     free( plink );
416509a48ffSpfg     plink = NULL;
417cdf0e10cSrcweir }
418cdf0e10cSrcweir  /**
419cdf0e10cSrcweir  * central function to call in tests
420cdf0e10cSrcweir  *
421cdf0e10cSrcweir  * @param rtl_TestResult* pThis_    = self pointer to TestResult structure
422cdf0e10cSrcweir  * @param sal_Bool state            = boolean result of statement comparison
423cdf0e10cSrcweir  * @param const sal_Char* msg       = message for actual statementcomparison
424cdf0e10cSrcweir  * @param const sal_Char* sub       = name of sub testfunction
425cdf0e10cSrcweir  * @param sal_Bool v                = boolean verbose parameter
426cdf0e10cSrcweir  *
427cdf0e10cSrcweir  * @return sal_Bool                 = determines if statement comparison
428cdf0e10cSrcweir  *                                    was positive or not
429cdf0e10cSrcweir  */
rtl_tres_state(rtl_TestResult * pThis_,sal_Bool state,const sal_Char * msg,const sal_Char * sub,sal_Bool v)430cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_state(
431cdf0e10cSrcweir                                         rtl_TestResult* pThis_,
432cdf0e10cSrcweir                                         sal_Bool state,
433cdf0e10cSrcweir                                         const sal_Char* msg,
434cdf0e10cSrcweir                                         const sal_Char* sub,
435cdf0e10cSrcweir                                         sal_Bool v
436cdf0e10cSrcweir                                         )
437cdf0e10cSrcweir {
438cdf0e10cSrcweir 
439cdf0e10cSrcweir     /* cast pointer to testresult data implementation struct*/
440cdf0e10cSrcweir     rtl_TestResult_Data* pData = (rtl_TestResult_Data*)pThis_;
441cdf0e10cSrcweir 
442cdf0e10cSrcweir     /* initialize funcstate pointer with masterstate */
443cdf0e10cSrcweir     rtl_FuncState* pFunc = pData->m_state;
444cdf0e10cSrcweir 
445cdf0e10cSrcweir     /* if substate required */
446cdf0e10cSrcweir     if ( sub )
447cdf0e10cSrcweir     {
448cdf0e10cSrcweir         /* link new created function state to last item */
449cdf0e10cSrcweir         pFunc = rtl_tres_link_funcstate( pFunc->m_prev,
450cdf0e10cSrcweir                                         rtl_tres_create_funcstate( sub ) );
451cdf0e10cSrcweir 
452cdf0e10cSrcweir         /* indicate this state as substate */
453cdf0e10cSrcweir         rtl_tres_setbit( pFunc, rtl_tres_Flag_SUB );
454cdf0e10cSrcweir 
455*922709c9Smseidel         /* indicate previous state as passed if no masterstate */
456cdf0e10cSrcweir         if ( pFunc->m_prev != pData->m_state )
457cdf0e10cSrcweir             rtl_tres_setbit( pFunc->m_prev, rtl_tres_Flag_PASSED );
458cdf0e10cSrcweir     }
459cdf0e10cSrcweir 
460cdf0e10cSrcweir 
461cdf0e10cSrcweir     /* test failed */
462cdf0e10cSrcweir     if( ! state )
463cdf0e10cSrcweir     {
464cdf0e10cSrcweir          /* determine if assertion should be thrown */
465cdf0e10cSrcweir         if ( rtl_tres_isbit( pThis_, rtl_tres_Flag_BOOM ) )
466cdf0e10cSrcweir         {
467cdf0e10cSrcweir             /* if message available */
468cdf0e10cSrcweir             if ( msg )
469cdf0e10cSrcweir                 TST_BOOM( state, msg );
470cdf0e10cSrcweir             else
471cdf0e10cSrcweir                 TST_BOOM( state, "no msg available" );
472cdf0e10cSrcweir         }
473cdf0e10cSrcweir 
474cdf0e10cSrcweir         /* clear this state ok flag and masterstate ok flag */
475cdf0e10cSrcweir         rtl_tres_clearbit( pFunc, rtl_tres_Flag_OK );
476cdf0e10cSrcweir         rtl_tres_clearbit( pData->m_state, rtl_tres_Flag_OK );
477cdf0e10cSrcweir     }
478cdf0e10cSrcweir     /* message available */
479cdf0e10cSrcweir     if( msg )
480cdf0e10cSrcweir     {
481cdf0e10cSrcweir         /* append a new comparison state */
482cdf0e10cSrcweir         if (! pFunc->m_cmp )
483cdf0e10cSrcweir             pFunc->m_cmp = rtl_tres_create_cmpstate( state, msg );
484cdf0e10cSrcweir         else
485cdf0e10cSrcweir             rtl_tres_link_cmpstate( pFunc->m_cmp,
486cdf0e10cSrcweir                             rtl_tres_create_cmpstate(state, msg ) );
487cdf0e10cSrcweir 
488cdf0e10cSrcweir         /* message to stderr required ? */
489cdf0e10cSrcweir         if ( v || ( pFunc->m_next->m_flags & rtl_tres_Flag_VERBOSE ) )
490cdf0e10cSrcweir             fprintf( stderr, "%s\n", msg );
491cdf0e10cSrcweir     }
492cdf0e10cSrcweir 
493cdf0e10cSrcweir     pFunc->m_stop = rtl_tres_timer();
494cdf0e10cSrcweir     return ( state );
495cdf0e10cSrcweir }
496cdf0e10cSrcweir 
497cdf0e10cSrcweir  /**
498cdf0e10cSrcweir   * rtl_tres_timer
499cdf0e10cSrcweir   * function to get actual timevalue
500cdf0e10cSrcweir   * this has to be replaced by a high resolution timer
501cdf0e10cSrcweir   */
rtl_tres_timer()502cdf0e10cSrcweir sal_uInt32 SAL_CALL rtl_tres_timer()
503cdf0e10cSrcweir {
504cdf0e10cSrcweir     sal_uInt32 val = 0;
505cdf0e10cSrcweir     TimeValue* tmv = (TimeValue*)malloc( sizeof( TimeValue ) );
506cdf0e10cSrcweir     osl_getSystemTime( tmv );
507cdf0e10cSrcweir     val = tmv->Nanosec/1000L;
508cdf0e10cSrcweir     free( tmv );
509cdf0e10cSrcweir     return ( val );
510cdf0e10cSrcweir }
511cdf0e10cSrcweir 
512cdf0e10cSrcweir 
rtl_tres_end(rtl_TestResult * pThis_,const sal_Char * msg)513cdf0e10cSrcweir static void SAL_CALL rtl_tres_end( rtl_TestResult* pThis_,
514cdf0e10cSrcweir                                                         const sal_Char* msg )
515cdf0e10cSrcweir {
516cdf0e10cSrcweir     rtl_TestResult_Data* pData = (rtl_TestResult_Data*) pThis_;
517cdf0e10cSrcweir 
518cdf0e10cSrcweir     if( msg )
519cdf0e10cSrcweir     {
520cdf0e10cSrcweir         if (! pData->m_state->m_cmp )
521cdf0e10cSrcweir             pData->m_state->m_cmp = rtl_tres_create_cmpstate( sal_True, msg );
522cdf0e10cSrcweir         else
523cdf0e10cSrcweir             rtl_tres_link_cmpstate( pData->m_state->m_cmp,
524cdf0e10cSrcweir                             rtl_tres_create_cmpstate( sal_True, msg ) );
525cdf0e10cSrcweir     }
526cdf0e10cSrcweir     pData->m_state->m_prev->m_flags |= rtl_tres_Flag_PASSED;
527cdf0e10cSrcweir     pData->m_state->m_flags |= rtl_tres_Flag_PASSED;
528cdf0e10cSrcweir     pData->m_state->m_stop = rtl_tres_timer();
529cdf0e10cSrcweir }
530cdf0e10cSrcweir 
531cdf0e10cSrcweir 
rtl_tres_ispassed(rtl_TestResult * pThis_)532cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_ispassed( rtl_TestResult* pThis_ )
533cdf0e10cSrcweir {
534cdf0e10cSrcweir     return rtl_tres_isbit( pThis_, rtl_tres_Flag_PASSED );
535cdf0e10cSrcweir }
536cdf0e10cSrcweir 
rtl_tres_isok(rtl_TestResult * pThis_)537cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_isok( rtl_TestResult* pThis_ )
538cdf0e10cSrcweir {
539cdf0e10cSrcweir     return rtl_tres_isbit( pThis_, rtl_tres_Flag_OK );
540cdf0e10cSrcweir }
541cdf0e10cSrcweir  /**
542cdf0e10cSrcweir  * return pointer to funcstate structure
543cdf0e10cSrcweir  */
rtl_tres_funcstate(rtl_TestResult * pThis_)544cdf0e10cSrcweir static rtl_funcstate SAL_CALL rtl_tres_funcstate( rtl_TestResult* pThis_ )
545cdf0e10cSrcweir {
546cdf0e10cSrcweir 
547cdf0e10cSrcweir     rtl_TestResult_Data* pThis = (rtl_TestResult_Data*) pThis_;
548cdf0e10cSrcweir     return (rtl_funcstate)pThis->m_state;
549cdf0e10cSrcweir }
550cdf0e10cSrcweir 
551cdf0e10cSrcweir  /**
552cdf0e10cSrcweir  * determine if a flag is set or not
553cdf0e10cSrcweir  */
rtl_tres_isbit(rtl_TestResult * pThis_,sal_uInt32 flag)554cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_isbit( rtl_TestResult* pThis_,
555cdf0e10cSrcweir                                                           sal_uInt32 flag  )
556cdf0e10cSrcweir {
557cdf0e10cSrcweir     return (sal_Bool)
558cdf0e10cSrcweir         ((((rtl_TestResult_Data *) pThis_)->m_state->m_flags & flag) == flag);
559cdf0e10cSrcweir }
560cdf0e10cSrcweir  /**
561cdf0e10cSrcweir   * set one single bit
562cdf0e10cSrcweir   */
rtl_tres_setbit(rtl_FuncState * pState_,sal_uInt32 flag)563cdf0e10cSrcweir static void SAL_CALL rtl_tres_setbit( rtl_FuncState* pState_,
564cdf0e10cSrcweir                                                           sal_uInt32 flag  )
565cdf0e10cSrcweir {
566cdf0e10cSrcweir     pState_->m_flags |= flag;
567cdf0e10cSrcweir }
568cdf0e10cSrcweir  /**
569cdf0e10cSrcweir   * clear one single bit
570cdf0e10cSrcweir   */
rtl_tres_clearbit(rtl_FuncState * pState_,sal_uInt32 flag)571cdf0e10cSrcweir static void SAL_CALL rtl_tres_clearbit( rtl_FuncState* pState_,
572cdf0e10cSrcweir                                                           sal_uInt32 flag  )
573cdf0e10cSrcweir {
574cdf0e10cSrcweir     pState_->m_flags = pState_->m_flags & ( ~flag );
575cdf0e10cSrcweir }
576cdf0e10cSrcweir 
577cdf0e10cSrcweir  /**
578cdf0e10cSrcweir   * returns next pointer of passed funcstate structure
579cdf0e10cSrcweir   */
rtl_tres_getnextfuncstate(rtl_funcstate fstate)580cdf0e10cSrcweir rtl_funcstate SAL_CALL rtl_tres_getnextfuncstate( rtl_funcstate fstate )
581cdf0e10cSrcweir {
582cdf0e10cSrcweir     rtl_FuncState* fs = (rtl_FuncState*)fstate;
583cdf0e10cSrcweir     return( (rtl_funcstate)fs->m_next );
584cdf0e10cSrcweir 
585cdf0e10cSrcweir }
586cdf0e10cSrcweir  /**
587cdf0e10cSrcweir   * returns previous pointer of passed funcstate structure
588cdf0e10cSrcweir   */
rtl_tres_getprevfuncstate(rtl_funcstate fstate)589cdf0e10cSrcweir rtl_funcstate SAL_CALL rtl_tres_getprevfuncstate( rtl_funcstate fstate )
590cdf0e10cSrcweir {
591cdf0e10cSrcweir     rtl_FuncState* fs = (rtl_FuncState*)fstate;
592cdf0e10cSrcweir     return( (rtl_funcstate)fs->m_prev );
593cdf0e10cSrcweir 
594cdf0e10cSrcweir }
595cdf0e10cSrcweir  /**
596cdf0e10cSrcweir   * returns flag value of passed funcstate structure
597cdf0e10cSrcweir   */
rtl_tres_getflags(rtl_funcstate fstate)598cdf0e10cSrcweir sal_uInt32 SAL_CALL rtl_tres_getflags( rtl_funcstate fstate )
599cdf0e10cSrcweir {
600cdf0e10cSrcweir     rtl_FuncState* fs = (rtl_FuncState*)fstate;
601cdf0e10cSrcweir     return( fs->m_flags );
602cdf0e10cSrcweir }
603cdf0e10cSrcweir  /**
604cdf0e10cSrcweir   * returns name of passed funcstate structure
605cdf0e10cSrcweir   */
rtl_tres_getname(rtl_funcstate fstate)606cdf0e10cSrcweir rtl_String* SAL_CALL rtl_tres_getname( rtl_funcstate fstate )
607cdf0e10cSrcweir {
608cdf0e10cSrcweir     rtl_FuncState* fs = (rtl_FuncState*)fstate;
609cdf0e10cSrcweir     return( fs->m_name );
610cdf0e10cSrcweir }
611cdf0e10cSrcweir  /**
612cdf0e10cSrcweir   * returns starttime of passed funcstate structure
613cdf0e10cSrcweir   */
rtl_tres_getstarttime(rtl_funcstate fstate)614cdf0e10cSrcweir sal_uInt32 SAL_CALL rtl_tres_getstarttime( rtl_funcstate fstate )
615cdf0e10cSrcweir {
616cdf0e10cSrcweir     rtl_FuncState* fs = (rtl_FuncState*)fstate;
617cdf0e10cSrcweir     return( fs->m_start );
618cdf0e10cSrcweir }
619cdf0e10cSrcweir 
620cdf0e10cSrcweir  /**
621cdf0e10cSrcweir   * returns stoptime of passed funcstate structure
622cdf0e10cSrcweir   */
rtl_tres_getstoptime(rtl_funcstate fstate)623cdf0e10cSrcweir sal_uInt32 SAL_CALL rtl_tres_getstoptime( rtl_funcstate fstate )
624cdf0e10cSrcweir {
625cdf0e10cSrcweir     rtl_FuncState* fs = (rtl_FuncState*)fstate;
626cdf0e10cSrcweir     return( fs->m_stop );
627cdf0e10cSrcweir }
628cdf0e10cSrcweir 
629cdf0e10cSrcweir  /**
630cdf0e10cSrcweir   * returns pointer to cmpstate of passed funcstate structure
631cdf0e10cSrcweir   */
rtl_tres_getcmpstate(rtl_funcstate fstate)632cdf0e10cSrcweir rtl_cmpstate SAL_CALL rtl_tres_getcmpstate( rtl_funcstate fstate)
633cdf0e10cSrcweir {
634cdf0e10cSrcweir     rtl_FuncState* fs = (rtl_FuncState*)fstate;
635cdf0e10cSrcweir     return( (rtl_cmpstate)fs->m_cmp );
636cdf0e10cSrcweir 
637cdf0e10cSrcweir }
638cdf0e10cSrcweir  /**
639cdf0e10cSrcweir   * returns boolean state of passed cmpstate structure
640cdf0e10cSrcweir   */
rtl_tres_getstat(rtl_cmpstate cstate)641cdf0e10cSrcweir sal_Bool SAL_CALL rtl_tres_getstat( rtl_cmpstate cstate)
642cdf0e10cSrcweir {
643cdf0e10cSrcweir     rtl_CmpState* cs = (rtl_CmpState*)cstate;
644cdf0e10cSrcweir     return( cs->m_stat );
645cdf0e10cSrcweir }
646cdf0e10cSrcweir  /**
647cdf0e10cSrcweir   * returns message of passed cmpstate structure
648cdf0e10cSrcweir   */
rtl_tres_getmsg(rtl_cmpstate cstate)649cdf0e10cSrcweir rtl_String* SAL_CALL rtl_tres_getmsg( rtl_cmpstate cstate)
650cdf0e10cSrcweir {
651cdf0e10cSrcweir     rtl_CmpState* cs = (rtl_CmpState*)cstate;
652cdf0e10cSrcweir     return( cs->m_msg );
653cdf0e10cSrcweir }
654cdf0e10cSrcweir  /**
655cdf0e10cSrcweir   * returns next pointer of passed cmpstate structure
656cdf0e10cSrcweir   */
rtl_tres_getnextcmpstate(rtl_cmpstate cstate)657cdf0e10cSrcweir rtl_cmpstate SAL_CALL rtl_tres_getnextcmpstate( rtl_cmpstate cstate)
658cdf0e10cSrcweir {
659cdf0e10cSrcweir     rtl_CmpState* cs = (rtl_CmpState*)cstate;
660cdf0e10cSrcweir     return( (rtl_cmpstate)cs->m_next );
661cdf0e10cSrcweir }
662cdf0e10cSrcweir 
663cdf0e10cSrcweir /*
664cdf0e10cSrcweir // <method_logPrintf>
665cdf0e10cSrcweir //inline void logPrintf ( const sal_Bool   bTestCaseState,
666cdf0e10cSrcweir //                            const char      *pFormatStr, ...
667cdf0e10cSrcweir //                            )
668cdf0e10cSrcweir //{
669cdf0e10cSrcweir //    if( m_pFunctions && m_pFunctions->pLogPrintf )
670cdf0e10cSrcweir //    {
671cdf0e10cSrcweir //        va_list   vArgumentList;
672cdf0e10cSrcweir //        va_start ( vArgumentList, pFormatStr );
673cdf0e10cSrcweir 
674cdf0e10cSrcweir //        m_pFunctions->pLogPrintf( this, bTestCaseState, pFormatStr, vArgumentList );
675cdf0e10cSrcweir 
676cdf0e10cSrcweir //        va_end ( vArgumentList );
677cdf0e10cSrcweir //    }
678cdf0e10cSrcweir //} // </method_logPrintf>
679cdf0e10cSrcweir  */
680