MHEG5  18.9.0
MHEG5 Documentation
mh5base.c
Go to the documentation of this file.
1 /*******************************************************************************
2  * Copyright © 2014 The DTVKit Open Software Foundation Ltd (www.dtvkit.org)
3  * Copyright © 2004 Ocean Blue Software Ltd
4  * Copyright © 2000 Koninklijke Philips Electronics N.V
5  *
6  * This file is part of a DTVKit Software Component
7  * You are permitted to copy, modify or distribute this file subject to the terms
8  * of the DTVKit 1.0 Licence which can be found in licence.txt or at www.dtvkit.org
9  *
10  * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
11  * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES
12  * OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
13  *
14  * If you or your organisation is not a member of DTVKit then you have access
15  * to this source code outside of the terms of the licence agreement
16  * and you are expected to delete this and any associated files immediately.
17  * Further information on DTVKit, membership and terms can be found at www.dtvkit.org
18  *******************************************************************************/
26 /*---includes for this file--------------------------------------------------*/
27 #include "mh5memory.h"
28 #include "mh5base.h"
29 #include "mh5debug.h"
30 #include "stb_os.h"
31 
32 #include <string.h>
33 #include <stdlib.h>
34 
35 #ifdef MH5PRINTOUT
36 #include <stdio.h>
37 #include "mh5eventtokens.h"
38 #include "mh5group.h"
39 #include "mh5application.h"
40 #include "dsm_types.h"
41 #endif
42 
43 /*---constant definitions for this file--------------------------------------*/
44 #ifdef MH5PRINTOUT
45 #define MHEG5CP_DEFAULT 127
46 #endif
47 
48 /*---local typedef structs for this file-------------------------------------*/
49 
50 /*---local (static) variable declarations for this file----------------------*/
51 
52 #ifdef MH5PRINTOUT
53 static int indent = 0;
54 #endif
55 
56 /*---local function definitions----------------------------------------------*/
57 
58 /*---global function definitions---------------------------------------------*/
59 
65 #ifdef MH5PRINTOUT
66 
67 void MHEG5indent(char *out)
68 {
69  int i;
70 
71  for (i = 0; i < indent; i++)
72  {
73  MHEG_PRINT(out, " ");
74  }
75 }
76 
77 int MHEG5setIndent(int i)
78 {
79  int rtn = indent;
80  indent = i;
81  return rtn;
82 }
83 
84 void MHEG5incIndent(void)
85 {
86  indent++;
87 }
88 
89 void MHEG5decIndent(void)
90 {
91  indent--;
92 }
93 
94 void MHEG5newLine(char *out)
95 {
96  MHEG_PRINT(out, "\n");
97 }
98 
99 void MHEG5classPrint(MHEG5Final class, char *out)
100 {
101  switch (class)
102  {
103  case MHEG5SCENE:
104  MHEG_PRINT(out, "{ :Scene");
105  break;
106  case MHEG5APPLICATION:
107  MHEG_PRINT(out, "{ :Application");
108  break;
109  case MHEG5LINK:
110  MHEG_PRINT(out, "{ :Link");
111  break;
112  case MHEG5PALETTE:
113  MHEG_PRINT(out, "{ :Palette");
114  break;
115  case MHEG5CURSORSHAPE:
116  MHEG_PRINT(out, "{ :Cursorshape");
117  break;
118  case MHEG5FONT:
119  MHEG_PRINT(out, "{ :Font");
120  break;
122  MHEG_PRINT(out, "{ :ResidentPrg");
123  break;
124  case MHEG5REMOTEPROGRAM:
125  MHEG_PRINT(out, "{ :Remoteprogram");
126  break;
128  MHEG_PRINT(out, "{ :Interchangedprogram");
129  break;
131  MHEG_PRINT(out, "{ :BooleanVar");
132  break;
134  MHEG_PRINT(out, "{ :IntegerVar");
135  break;
137  MHEG_PRINT(out, "{ :OStringVar");
138  break;
140  MHEG_PRINT(out, "{ :ObjectRefVar");
141  break;
143  MHEG_PRINT(out, "{ :ContentRefVar");
144  break;
145  case MHEG5STREAM:
146  MHEG_PRINT(out, "{ :Stream");
147  break;
148  case MHEG5AUDIO:
149  MHEG_PRINT(out, "{ :Audio");
150  break;
151  case MHEG5TOKENGROUP:
152  MHEG_PRINT(out, "{ :Tokengroup");
153  break;
154  case MHEG5LISTGROUP:
155  MHEG_PRINT(out, "{ :Listgroup");
156  break;
157  case MHEG5RTGRAPHICS:
158  MHEG_PRINT(out, "{ :Rtgraphics");
159  break;
160  case MHEG5LINEART:
161  MHEG_PRINT(out, "{ :Lineart");
162  break;
163  case MHEG5BITMAP:
164  MHEG_PRINT(out, "{ :Bitmap");
165  break;
166  case MHEG5TEXT:
167  MHEG_PRINT(out, "{ :Text");
168  break;
169  case MHEG5VIDEO:
170  MHEG_PRINT(out, "{ :Video");
171  break;
172  case MHEG5SLIDER:
173  MHEG_PRINT(out, "{ :Slider");
174  break;
175  case MHEG5DYNAMICLINEART:
176  MHEG_PRINT(out, "{ :Dynamiclineart");
177  break;
178  case MHEG5RECTANGLE:
179  MHEG_PRINT(out, "{ :Rectangle");
180  break;
181  case MHEG5ENTRYFIELD:
182  MHEG_PRINT(out, "{ :Entryfield");
183  break;
184  case MHEG5HYPERTEXT:
185  MHEG_PRINT(out, "{ :Hypertext");
186  break;
187  case MHEG5HOTSPOT:
188  MHEG_PRINT(out, "{ :Hotspot");
189  break;
190  case MHEG5PUSHBUTTON:
191  MHEG_PRINT(out, "{ :Pushbutton");
192  break;
193  case MHEG5SWITCHBUTTON:
194  MHEG_PRINT(out, "{ :Switchbutton");
195  break;
196  default:
197  MHEG_PRINT(out, "{:InternalError");
198  break;
199  }
200 }
201 
202 #endif /* #ifdef MH5PRINTOUT */
203 
204 #if defined(MHEG5LOG) || defined(MH5PRINTOUT)
205 
206 /* The following are even when MH5PRINTOUT is not defined */
207 
208 void MHEG5eventPrint(MHEG5EventType e, char *out)
209 {
210  MHEG_PRINT(out, MHEG5eventToString(e));
211 }
212 
213 void MHEG5stringPrint(MHEG5String s, char *out)
214 {
215  char buff[1024];
216  int i, j;
217 
218  j = 0;
219  for (i = 0; i != s.len && j < 1020; i++)
220  {
221  if ((s.data[i] >= ' ' && s.data[i] < '=') ||
222  (s.data[i] > '=' && s.data[i] <= 127) ||
223  s.data[i] == 0x09)
224  {
225  buff[j++] = s.data[i];
226  }
227  else
228  {
229  buff[j++] = '=';
230  buff[j++] = (s.data[i] >> 4) < 10 ? (s.data[i] >> 4) + '0' : (s.data[i] >> 4) + 'A' - 10;
231  buff[j++] = (s.data[i] & 0x0F) < 10 ? (s.data[i] & 0x0F) + '0' : (s.data[i] & 0x0F) + 'A' - 10;
232  }
233  }
234  buff[j] = '\0';
235  MHEG_PRINT(out, "'");
236  MHEG_PRINT(out, buff);
237  MHEG_PRINT(out, "'");
238 }
239 
240 void MHEG5octetPrint(MHEG5String s, char *out)
241 {
242  char buff[128];
243  int i, j;
244 
245  j = 0;
246  for (i = 0; i != s.len && j < 124; i++)
247  {
248  buff[j++] = '=';
249  buff[j++] = (s.data[i] >> 4) < 10 ? (s.data[i] >> 4) + '0' : (s.data[i] >> 4) + 'A' - 10;
250  buff[j++] = (s.data[i] & 0x0F) < 10 ? (s.data[i] & 0x0F) + '0' : (s.data[i] & 0x0F) + 'A' - 10;
251  }
252  buff[j] = '\0';
253  MHEG_PRINT(out, "'");
254  MHEG_PRINT(out, buff);
255  MHEG_PRINT(out, "'");
256 }
257 
258 void MHEG5objectrefPrint(MHEG5ObjectReference o, char *out)
259 {
260  if (o.gref.len)
261  {
262  MHEG_PRINT(out, "(");
263  MHEG5stringPrint( *((MHEG5String *)&o.gref), out );
264  MHEG_PRINT(out, " ");
265  MHEG5intPrint(o.id, out);
266  MHEG_PRINT(out, ")");
267  }
268  else
269  {
270  MHEG5intPrint(o.id, out);
271  }
272 }
273 
274 void MHEG5boolPrint(MHEG5Bool b, char *out)
275 {
276  if (b)
277  {
278  MHEG_PRINT(out, "TRUE");
279  }
280  else
281  {
282  MHEG_PRINT(out, "FALSE");
283  }
284 }
285 
286 static MHEG5Root* FindObject(MH5GroupRef gref, MHEG5Int id)
287 {
288  MHEG5Ingredient *search = 0;
289  MH5GroupPtr pGroup;
290 
291  pGroup = gref.ptr.group;
292  if (pGroup && gref.len == 0)
293  {
294  search = pGroup->hashIngred[id & 0xff];
295  while (search && (search->root.id != id))
296  {
297  search = search->hnxt;
298  }
299  }
300  else
301  {
303  if (pGroup)
304  {
305  search = pGroup->hashIngred[id & 0xff];
306  while (search && (search->root.id != id))
307  {
308  search = search->hnxt;
309  }
310  }
311  }
312  return (MHEG5Root *) search;
313 }
314 
315 void MHEG5genericPrint(MHEG5Generic g, char *out, U8BIT dotype)
316 {
317  switch (g.type)
318  {
319  case MHEG5NONE:
320  //MHEG_PRINT(out,"");
321  break;
322  case MHEG5INT:
323  if (dotype == 1)
324  MHEG_PRINT(out, ":GInteger ");
325  if (g.indirect)
326  MHEG_PRINT(out, ":IndirectRef ");
327  MHEG5intPrint(g.value.i, out);
328  break;
329  case MHEG5BOOL:
330  if (dotype == 1)
331  MHEG_PRINT(out, ":GBoolean ");
332  if (g.indirect)
333  MHEG_PRINT(out, ":IndirectRef ");
334  MHEG5boolPrint(g.value.b, out);
335  break;
336  case MHEG5NULL:
337  //MHEG_PRINT(out,"");
338  break;
339  case MHEG5OCTETSTRING:
340  if (dotype == 1)
341  MHEG_PRINT(out, ":GOctetString ");
342  if (g.indirect)
343  MHEG_PRINT(out, ":IndirectRef ");
344  MHEG5stringPrint(g.value.s, out);
345  break;
346  case MHEG5BRACKETOPEN:
347  MHEG_PRINT(out, "(");
348  break;
349  case MHEG5BRACKETCLOSE:
350  MHEG_PRINT(out, ")");
351  break;
352  case MHEG5EVENT:
353  MHEG5eventPrint(g.value.e, out);
354  break;
355  case MHEG5INTPAIR:
356  MHEG5intPrint(g.value.p.x, out);
357  MHEG_PRINT(out, " ");
358  MHEG5intPrint(g.value.p.y, out);
359  break;
360  case MHEG5OBJREFEXT:
361  case MHEG5OBJECTREF:
362  //MHEG_PRINT(out,":GObjectRef ");
363  //if (g.indirect) MHEG_PRINT(out,":IndirectRef ");
364  if (g.indirect)
365  {
366  if (dotype)
367  {
368  MHEG5Root *object;
369  object = FindObject(g.value.o.gref, g.value.o.id);
370  if (object)
371  {
372  switch (object->clazz)
373  {
375  MHEG_PRINT(out, ":GBoolean ");
376  break;
378  if (dotype == 1)
379  {
380  MHEG_PRINT(out, ":GOctetString ");
381  }
382  else if (dotype == 4)
383  {
384  MHEG_PRINT(out, ":NewAbsoluteColour ");
385  }
386  break;
388  MHEG_PRINT(out, ":GInteger ");
389  break;
391  MHEG_PRINT(out, ":GObjectRef ");
392  break;
394  if (dotype == 2)
395  {
396  MHEG_PRINT(out, ":NewRefContent (");
397  dotype++;
398  }
399  else
400  {
401  MHEG_PRINT(out, ":GContentRef ");
402  }
403  break;
404  default:;
405  }
406  }
407  }
408  MHEG_PRINT(out, ":IndirectRef ");
409  }
410  else if (dotype)
411  {
412  MHEG_PRINT(out, ":GObjectRef ");
413  }
414  MHEG5objectrefPrint(g.value.o, out);
415  //if ( dotype == 3 )
416  //{
417  // MHEG_PRINT(out," )");
418  //}
419  break;
420  case MHEG5CONTENTREF:
421  MHEG_PRINT(out, ":NewRefContent (");
422  MHEG5stringPrint(g.value.s, out);
423  break;
424  default:
425  MHEG_PRINT(out, "// :InternalError ");
426  break;
427  }
428 }
429 
430 void MHEG5colourPrint(MHEG5Colour c, char *out)
431 {
432  switch (c.type)
433  {
434  case MHEG5INT:
435  MHEG5hexPrint(c.value.i, out);
436  break;
437  case MHEG5OCTETSTRING:
438  MHEG5octetPrint(c.value.s, out);
439  break;
440  default:
441  MHEG_PRINT(out, "??");
442  break;
443  }
444 }
445 
446 void MHEG5gListPrint(MHEG5GList *l, char *out, U8BIT noTypeCnt)
447 {
448  U8BIT count = 1;
449  do
450  {
451  MHEG5genericPrint(l->generic, out, (count > noTypeCnt) ? 1 : 0);
452  MHEG_PRINT(out, " ");
453  l++;
454  count++;
455  }
456  while (!l->generic.isfirst);
457 }
458 
459 void MHEG5sdListPrint(MHEG5GList *l, char *out)
460 {
461  MHEG5genericPrint(l->generic, out, 0);
462  MHEG_PRINT(out, " ");
463  l++;
464  if (l->generic.type == MHEG5CONTENTREF)
465  {
466  MHEG5genericPrint(l->generic, out, 0);
467  MHEG_PRINT(out, " ");
468  l++;
469  if (!l->generic.isfirst)
470  {
471  l++; // skip 'new size'
472  if (!l->generic.isfirst &&
473  l->generic.type == MHEG5INT &&
475  {
476  MHEG_PRINT(out, " :NewCCPriority ");
477  MHEG5intPrint(l->generic.value.i, out);
478  }
479  }
480  MHEG_PRINT(out, " )");
481  }
482  else
483  {
484  do
485  {
486  MHEG5genericPrint(l->generic, out, 2);
487  MHEG_PRINT(out, " ");
488  l++;
489  }
490  while (!l->generic.isfirst);
491  }
492 }
493 
494 void MHEG5clrListPrint(MHEG5GList *l, char *out)
495 {
496  MHEG5genericPrint(l->generic, out, FALSE);
497  MHEG_PRINT(out, " ");
498  l++;
499  do
500  {
501  MHEG5genericPrint(l->generic, out, 4);
502  MHEG_PRINT(out, " ");
503  l++;
504  }
505  while (!l->generic.isfirst);
506 }
507 
508 void MHEG5cListPrint(MHEG5GList *l, char *out)
509 {
510  MHEG5genericPrint(l->generic, out, 0);
511  MHEG_PRINT(out, " ");
512  l++;
513  MHEG5genericPrint(l->generic, out, 0);
514  MHEG_PRINT(out, " ");
515  l++;
516  indent += 4;
517  do
518  {
519  if (l->generic.type != MHEG5NONE)
520  {
521  MHEG5newLine(out);
522  MHEG5indent(out);
523  MHEG5genericPrint(l->generic, out, 1);
524  MHEG_PRINT(out, " ");
525  }
526  l++;
527  }
528  while (!l->generic.isfirst);
529  indent -= 4;
530  MHEG5newLine(out);
531  MHEG5indent(out);
532 }
533 
534 #endif /* #ifdef MHEG5LOG || MH5PRINTOUT */
535 
536 
537 #ifdef MHEG5LOG
538 /*
539  String Functions
540  */
548 char* MHEG5stringGet(MHEG5String source) {
549  char *rc;
550 
551  rc = MHEG5getMem( source.len + 1 );
552  assert(rc);
553  if (rc != 0)
554  {
555  memcpy(rc, source.data, source.len);
556  rc[source.len] = '\0';
557  }
558  return rc;
559 }
560 
561 #endif
562 
563 
571 #ifdef MHG_TRACK_MEM
572 MHEG5String MHEG5stringCopyFunc(MHEG5String source, int line )
573 #else
575 #endif
576 {
577  MHEG5String rc;
578 
579  if (source.len != 0)
580  {
581  #ifdef MHG_TRACK_MEM
582  rc.data = STR_DataAllocFunc( source.len, line + 5000 );
583  #else
584  rc.data = STR_DataAlloc( source.len );
585  #endif
586  if (rc.data)
587  {
588  assert(rc.data != source.data);
589  memcpy(rc.data, source.data, source.len);
590  rc.len = source.len;
591  }
592  else
593  {
594  rc.len = 0;
595  }
596  }
597  else
598  {
599  rc.data = NULL;
600  rc.len = 0;
601  }
602  return rc;
603 }
604 
612 MHEG5String MHEG5stringCopyChr(const char *source)
613 {
614  MHEG5String rc;
615 
616  /* Determine the length of the string to copy */
617  rc.len = strlen(source);
618 
619  if (rc.len == 0)
620  {
621  rc.data = NULL;
622  }
623  else
624  {
625  /* Allocate some memory for the string data */
626  rc.data = STR_DataAlloc( rc.len );
627  if (rc.data == NULL)
628  {
629  /* Alloc failed. Set the length to 0 and return */
630  rc.len = 0;
631  }
632  else
633  {
634  memcpy(rc.data, source, rc.len);
635  }
636  }
637  return rc;
638 }
639 
649 {
650  MHEG5String rc;
651 
652  if (source1.len + source2.len == 0)
653  {
654  rc.len = 0;
655  rc.data = NULL;
656  }
657  else
658  {
659  rc.data = STR_DataAlloc( source1.len + source2.len );
660  if (rc.data == NULL)
661  {
662  rc.len = 0;
663  }
664  else
665  {
666  if (source1.len > 0)
667  {
668  memcpy(rc.data, source1.data, source1.len);
669  }
670  if (source2.len > 0)
671  {
672  memcpy(&rc.data[source1.len], source2.data, source2.len);
673  }
674  rc.len = source1.len + source2.len;
675  }
676  }
677  return rc;
678 }
679 
687 {
688  /* Note: even zero length string gets an allocation */
689  if (item->data != NULL)
690  {
691  /*TRACE(TFILE,("destoy string %.*s",(int)item->len,item->data))*/
692  STR_DataFree( item->data, item->len );
693  item->data = NULL;
694  item->len = 0;
695  }
696 }
697 
698 /*
699  Compare Strings - not case sensitive!
700  */
701 
711 {
712  if (s1->len != s2->len)
713  {
714  /* Lengths do not match, so strings cannot be equal. */
715  return MHEG5FALSE;
716  }
717 
718  if (s1->data == s2->data)
719  {
720  /* If the data pointer is equal, the strings must be equal */
721  return MHEG5TRUE; /* Always TRUE */
722  }
723 
724  if (memcmp(s1->data, s2->data, s1->len) != 0)
725  {
726  return MHEG5FALSE;
727  }
728 
729  return MHEG5TRUE;
730 }
731 
740 {
741  register int i, mp = 1, j = 0;
742  register int rc = 0;
743 
744  if (!string.len)
745  return 0;
746  if ((string.len > 1) && ((string.data[1] == 'x') || (string.data[1] == 'X'))) /* HEX INT */
747  {
748  for (i = 2; i < string.len; i++)
749  if ((string.data[i] >= '0') && (string.data[i] <= '9'))
750  rc = rc * 16 + ((int) string.data[i] - (int) '0');
751  else if ((string.data[i] >= 'a') && (string.data[i] <= 'z'))
752  rc = rc * 16 + ((int) string.data[i] - (int) 'a') + 10;
753  else if ((string.data[i] >= 'A') && (string.data[i] <= 'Z'))
754  rc = rc * 16 + ((int) string.data[i] - (int) 'A') + 10;
755  else
756  break;
757  return rc;
758  }
759  /*
760  DEZ INT
761  */
762  if (string.data[0] == '-')
763  {
764  mp = -1;
765  j = 1;
766  } /* negativ value */
767  if (string.data[0] == '+')
768  {
769  mp = 1;
770  j = 1;
771  } /* explicit positiv value */
772  for (i = j; i < string.len; i++)
773  if ((string.data[i] >= '0') && (string.data[i] <= '9'))
774  rc = rc * 10 + ((int) string.data[i] - (int) '0');
775  else
776  break;
777  return mp * rc;
778 }
779 
788 {
789  char buf[100];
790  register int pos = 0, jj, sgn = 0;
791  MHEG5String rc;
792 
793  buf[0] = '\0';
794  if (i < (MHEG5Int)0)
795  {
796  sgn = 1;
797  }
798  while (i != (MHEG5Int)0)
799  {
800  jj = i % 10;
801  i = i / 10;
802  buf[pos++] = (char) (abs(jj) + (int) '0');
803  }
804  if (!pos)
805  {
806  buf[pos++] = '0';
807  }
808  else if (sgn)
809  {
810  buf[pos++] = '-';
811  }
812  rc.data = STR_DataAlloc( pos );
813  if (!rc.data)
814  {
815  rc.len = 0;
816  }
817  else
818  {
819  for (jj = 0; jj < pos; jj++)
820  {
821  rc.data[jj] = buf[pos - 1 - jj];
822  }
823  rc.len = pos;
824  }
825  return rc;
826 }
827 
835 {
836  assert(item);
837  switch (item->type)
838  {
839  case MHEG5OCTETSTRING:
840  case MHEG5CONTENTREF:
841  if (!item->indirect)
842  {
843  MHEG5stringDestruct(&item->value.s);
844  }
845  break;
846  case MHEG5OBJREFEXT:
848  break;
849  default:
850  ;
851  }
852 }
853 
862 {
863  if (!dest)
864  {
865  return;
866  }
867 
868  if (!src)
869  {
870  return;
871  }
872 
873  *dest = *src;
874 
875  if (src->type == MHEG5OCTETSTRING)
876  {
877  dest->value.s = MHEG5stringCopy(src->value.s);
878  }
879 }
880 
890 {
891  if (g1 == g2)
892  return MHEG5TRUE;
893  if (!g1)
894  return MHEG5FALSE;
895  if (!g2)
896  return MHEG5FALSE;
897  if (g1->type != g2->type)
898  return MHEG5FALSE;
899  if (g1->indirect != g2->indirect)
900  return MHEG5FALSE;
901  if (!g1->indirect)
902  {
903  switch (g1->type)
904  {
905  /* Types which have no value */
906  case MHEG5NONE:
907  case MHEG5OBJREFEXT:
908  case MHEG5BRACKETOPEN:
909  case MHEG5BRACKETCLOSE:
910  case MHEG5NULL:
911  return MHEG5TRUE;
912  case MHEG5INT:
913  return (MHEG5Bool) (g1->value.i == g2->value.i);
914  case MHEG5BOOL:
915  return (MHEG5Bool) ((g1->value.b != MHEG5FALSE) == (g2->value.b != MHEG5FALSE));
916  case MHEG5OCTETSTRING:
917  return MHEG5stringEqual(&g1->value.s, &g2->value.s);
918  case MHEG5EVENT:
919  return (MHEG5Bool) (g1->value.e == g2->value.e);
920  default:
921  return MHEG5FALSE;
922  }
923  }
924  return MHEG5FALSE;
925 }
926 
934 {
935  assert(item);
936  do
937  {
939  item = item->next;
940  } while (item);
941 }
942 
951 {
952  MHEG5GList *rc = 0, *prev = 0, *dest;
953 
954  while (list)
955  {
956  dest = MHEG5getMem( sizeof(MHEG5GList));
957  if (!dest)
958  return 0;
959  MHEG5genericCopy(&dest->generic, &list->generic);
960  dest->next = 0;
961  if (!rc)
962  rc = dest;
963  if (prev)
964  prev->next = dest;
965  prev = dest;
966  list = list->next;
967  }
968  return rc;
969 }
970 
978 void MHEG5genericSet(MHEG5Generic *item, MHEG5Int initialValue)
979 {
980  assert(item);
981  item->indirect = MHEG5FALSE;
982  item->type = MHEG5INT;
983  item->value.i = initialValue;
984 }
985 
986 #ifdef MHG_STRNCMP
987 
988 /* special WINCE routines
989  */
990 int MHEG5strncmp(char *a, char *b, int n)
991 {
992  int i;
993 
994  for (i = 0; i < n; i++)
995  {
996  if ((a[i] == 0) && (b[i] == 0))
997  {
998  return 0;
999  }
1000 
1001  if (a[i] == 0)
1002  {
1003  return -1;
1004  }
1005 
1006  if (b[i] == 0)
1007  {
1008  return 1;
1009  }
1010 
1011  if (a[i] < b[i])
1012  {
1013  return -1;
1014  }
1015  else if (a[i] > b[i])
1016  {
1017  return 1;
1018  }
1019  }
1020 
1021  return 0;
1022 }
1023 
1024 #endif /* #ifdef MHG_STRNCMP */
1025 
1026 
1027 #ifdef MHG_STRCMP
1028 
1029 int MHEG5strcmp(char *a, char *b)
1030 {
1031  int i;
1032 
1033  for (i = 0;; i++)
1034  {
1035  if ((a[i] == 0) && (b[i] == 0))
1036  {
1037  return 0;
1038  }
1039 
1040  if (a[i] == 0)
1041  {
1042  return -1;
1043  }
1044 
1045  if (b[i] == 0)
1046  {
1047  return 1;
1048  }
1049 
1050  if (a[i] < b[i])
1051  {
1052  return -1;
1053  }
1054  else if (a[i] > b[i])
1055  {
1056  return 1;
1057  }
1058  }
1059 
1060  /* This line is never reached */
1061  return 0;
1062 }
1063 
1064 #endif /* #ifdef MHG_STRCMP */
1065 
1066 
1071 unsigned long MHEG5random(void)
1072 {
1073  static unsigned long randval = 0;
1074 
1075  if (randval == 0)
1076  {
1077  /* Seed the random number generator with the current time
1078  */
1079  randval = STB_OSGetClockMilliseconds();
1080  }
1081 
1082  /* The following numbers come from NUMERICAL RECIPES IN C: THE ART OF
1083  * SCIENTIFIC COMPUTING (ISBN 0-521-43108-5)
1084  *
1085  * Online version available at:
1086  * http://www.ulib.org/webRoot/Books/Numerical_Recipes/bookcpdf/c7-1.pdf
1087  */
1088  randval = 1664525 * randval + 1013904223;
1089 
1090  return randval;
1091 }
1092 
1103 char* MHEG5safeStrcat(char *dest, size_t destLength, const char *source)
1104 {
1105  size_t destIndex;
1106  size_t sourceIndex;
1107 
1108  destIndex = strlen(dest);
1109  sourceIndex = 0;
1110  while ((source[sourceIndex] != '\0') && (destIndex < destLength - 1))
1111  {
1112  dest[destIndex] = source[sourceIndex];
1113  sourceIndex++;
1114  destIndex++;
1115  }
1116  dest[destIndex] = '\0';
1117 
1118  return dest;
1119 }
1120 
1121 #if defined(_WIN32_WCE)
1122 
1123 char tempstr[256];
1124 TCHAR wtempstr[256];
1125 
1126 TCHAR* StrToUnicode(char *string)
1127 {
1128  MultiByteToWideChar(CP_ACP, MB_COMPOSITE, string, -1, wtempstr, 255);
1129  return wtempstr;
1130 }
1131 
1132 char* StrFromUnicode(TCHAR *string)
1133 {
1134  WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK | WC_DEFAULTCHAR | WC_SEPCHARS, string, -1, tempstr, sizeof(tempstr) - 1, NULL, NULL);
1135  return tempstr;
1136 }
1137 
1138 #endif
U32BIT STB_OSGetClockMilliseconds(void)
Get Current Computer Clock Time.
U8BIT indirect
Definition: mh5base.h:149
MH5GroupRef gref
Definition: mh5base.h:110
Basis MHEG5 data types.
MHEG5Int MHEG5strToInt(MHEG5String string)
Convert a MHEG5String to a MHEG5Integer.
Definition: mh5base.c:739
U8BIT isfirst
Definition: mh5base.h:150
Event to String conversion.
const char * data
Definition: mh5gate.c:56
MHEG5Int i
Definition: mh5base.h:154
unsigned long MHEG5random(void)
Calculate and return a psuedo random number.
Definition: mh5base.c:1071
MHEG5String s
Definition: mh5base.h:156
MHEG5Bool MHEG5genericEqual(MHEG5Generic *g1, MHEG5Generic *g2)
Compare two generic Variables.
Definition: mh5base.c:889
MHEG5ObjectReference o
Definition: mh5base.h:159
U16BIT type
Definition: mh5base.h:151
void MHEG5gListDestruct(MHEG5GList *item)
Destruct a list of MHEG5Generic objects.
Definition: mh5base.c:933
struct sMHEG5Group * MH5GroupPtr
Definition: mh5base.h:95
unsigned char * STR_DataAlloc(unsigned int size)
Definition: glue_memory.c:596
MHEG5String MHEG5stringCat(MHEG5String source1, MHEG5String source2)
Concatenate two MHEG5Strings.
Definition: mh5base.c:648
#define MHEG5getMem
Definition: glue_memory.h:93
MHEG5Final clazz
Definition: mh5root.h:55
MHEG5Bool b
Definition: mh5base.h:155
MHEG5Ingredient * hashIngred[256]
Definition: mh5group.h:64
union sMH5GroupRef::@5 ptr
Implementation of the Group class Description Defines the structure and behaviour of objects used as ...
MHEG5GList * MHEG5gListCopy(MHEG5GList *list)
Copy a list of MHEG5Generic objects.
Definition: mh5base.c:950
MHEG5Final
Definition: mh5base.h:190
union MHEG5Generic::@6 value
MHEG5EventType
Definition: mh5base.h:114
MHEG5String MHEG5intToStr(MHEG5Int i)
Convert MHEG5Int to MHEG5String.
Definition: mh5base.c:787
uint8_t U8BIT
Definition: techtype.h:82
long MHEG5Int
Definition: mh5base.h:73
#define MHEG5CP_DEFAULT
MHEG5String MHEG5stringCopy(MHEG5String source)
<Function description>="">
Definition: mh5base.c:574
struct sMHEG5Ingredient * hnxt
Definition: mh5ingredient.h:85
void MHEG5stringDestruct(MHEG5String *item)
Destruct a MHEG5String.
Definition: mh5base.c:686
MHEG5Int x
Definition: mh5base.h:78
void STR_DataFree(unsigned char *data, unsigned int size)
Definition: glue_memory.c:668
short MHEG5Bool
Definition: mh5base.h:71
const char * MHEG5eventToString(MHEG5EventType event)
char * MHEG5safeStrcat(char *dest, size_t destLength, const char *source)
Perform a standard strcat restricted to the length of the destination. The dest string will always be...
Definition: mh5base.c:1103
void MHEG5genericDestruct(MHEG5Generic *item)
Destruct a MHEG5Generic.
Definition: mh5base.c:834
MHEG5Byte * data
Definition: mh5base.h:85
int len
Definition: mh5gate.c:57
#define MHEG5TRUE
Definition: mh5base.h:49
#define MHEG5strncmp(a, b, n)
Definition: mh5base.h:52
Implementation of the MHEG5 Application Class Defines a set of Ingredient objects, which are shared within an application scope. Base class: Group Subclasses: None Status: Concrete class.
Mheg5 logging and debug printing.
MHEG5Int len
Definition: mh5base.h:99
MHEG5Bool MHEG5stringEqual(MHEG5String *s1, MHEG5String *s2)
Compare two Strings (case sensitive!)
Definition: mh5base.c:710
redirection include
MHEG5Int id
Definition: mh5root.h:48
#define FALSE
Definition: techtype.h:68
void MHEG5genericSet(MHEG5Generic *item, MHEG5Int initialValue)
Set a MHEG5Generic to the MHEG5Int value.
Definition: mh5base.c:978
MH5GroupPtr group
Definition: mh5base.h:103
MHEG5EventType e
Definition: mh5base.h:157
MHEG5Int len
Definition: mh5base.h:84
MHEG5String MHEG5stringCopyChr(const char *source)
Copy the C-String source to a MHEG5String.
Definition: mh5base.c:612
void MHEG5genericCopy(MHEG5Generic *dest, MHEG5Generic *src)
Copy a MHEG5Generic.
Definition: mh5base.c:861
#define MHEG5strcmp(a, b)
Definition: mh5base.h:56
MHEG5Generic generic
Definition: mh5base.h:171
struct sMHEG5GList * next
Definition: mh5base.h:172
MHEG5Int y
Definition: mh5base.h:79
#define MHEG5FALSE
Definition: mh5base.h:48
MHEG5IntPair p
Definition: mh5base.h:158
MHEG5Application * MHEG5getCurrentApplication(void)
<Function description>="">
Header file - Function prototypes for operating system.