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