otlbase.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include "otlbase.h"
  2. #include "otlcommn.h"
  3. static void
  4. otl_base_coord_validate( OTL_Bytes table,
  5. OTL_Validator valid )
  6. {
  7. OTL_Bytes p = table;
  8. OTL_UInt format;
  9. OTL_CHECK( 4 );
  10. format = OTL_NEXT_USHORT( p );
  11. p += 2;
  12. switch ( format )
  13. {
  14. case 1:
  15. break;
  16. case 2:
  17. OTL_CHECK( 4 );
  18. break;
  19. case 3:
  20. OTL_CHECK( 2 );
  21. otl_device_table_validate( table + OTL_PEEK_USHORT( p ) );
  22. break;
  23. default:
  24. OTL_INVALID_DATA;
  25. }
  26. }
  27. static void
  28. otl_base_tag_list_validate( OTL_Bytes table,
  29. OTL_Validator valid )
  30. {
  31. OTL_Bytes p = table;
  32. OTL_UInt count;
  33. OTL_CHECK(2);
  34. count = OTL_NEXT_USHORT( p );
  35. OTL_CHECK( count*4 );
  36. }
  37. static void
  38. otl_base_values_validate( OTL_Bytes table,
  39. OTL_Validator valid )
  40. {
  41. OTL_Bytes p = table;
  42. OTL_UInt count;
  43. OTL_CHECK( 4 );
  44. p += 2; /* skip default index */
  45. count = OTL_NEXT_USHORT( p );
  46. OTL_CHECK( count*2 );
  47. for ( ; count > 0; count-- )
  48. otl_base_coord_validate( table + OTL_NEXT_USHORT( p ), valid );
  49. }
  50. static void
  51. otl_base_minmax_validate( OTL_Bytes table,
  52. OTL_Validator valid )
  53. {
  54. OTL_Bytes p = table;
  55. OTL_UInt min_coord, max_coord, count;
  56. OTL_CHECK(6);
  57. min_coord = OTL_NEXT_USHORT( p );
  58. max_coord = OTL_NEXT_USHORT( p );
  59. count = OTL_NEXT_USHORT( p );
  60. if ( min_coord )
  61. otl_base_coord_validate( table + min_coord, valid );
  62. if ( max_coord )
  63. otl_base_coord_validate( table + max_coord, valid );
  64. OTL_CHECK( count*8 );
  65. for ( ; count > 0; count-- )
  66. {
  67. p += 4; /* ignore tag */
  68. min_coord = OTL_NEXT_USHORT( p );
  69. max_coord = OTL_NEXT_USHORT( p );
  70. if ( min_coord )
  71. otl_base_coord_validate( table + min_coord, valid );
  72. if ( max_coord )
  73. otl_base_coord_validate( table + max_coord, valid );
  74. }
  75. }
  76. static void
  77. otl_base_script_validate( OTL_Bytes table,
  78. OTL_Validator valid )
  79. {
  80. OTL_Bytes p = table;
  81. OTL_UInt values, default_minmax;
  82. OTL_CHECK(6);
  83. values = OTL_NEXT_USHORT( p );
  84. default_minmax = OTL_NEXT_USHORT( p );
  85. count = OTL_NEXT_USHORT( p );
  86. if ( values )
  87. otl_base_values_validate( table + values, valid );
  88. if ( default_minmax )
  89. otl_base_minmax_validate( table + default_minmax, valid );
  90. OTL_CHECK( count*6 );
  91. for ( ; count > 0; count-- )
  92. {
  93. p += 4; /* ignore tag */
  94. otl_base_minmax_validate( table + OTL_NEXT_USHORT( p ), valid );
  95. }
  96. }
  97. static void
  98. otl_base_script_list_validate( OTL_Bytes table,
  99. OTL_Validator valid )
  100. {
  101. OTL_Bytes p = table;
  102. OTL_UInt count;
  103. OTL_CHECK(2);
  104. count = OTL_NEXT_USHORT( p );
  105. OTL_CHECK(count*6);
  106. for ( ; count > 0; count-- )
  107. {
  108. p += 4; /* ignore script tag */
  109. otl_base_script_validate( table + OTL_NEXT_USHORT( p ) );
  110. }
  111. }
  112. static void
  113. otl_axis_table_validate( OTL_Bytes table,
  114. OTL_Validator valid )
  115. {
  116. OTL_Bytes p = table;
  117. OTL_UInt tags;
  118. OTL_CHECK(4);
  119. tags = OTL_NEXT_USHORT( p );
  120. if ( tags )
  121. otl_base_tag_list_validate ( table + tags );
  122. otl_base_script_list_validate( table + OTL_NEXT_USHORT( p ) );
  123. }
  124. OTL_LOCALDEF( void )
  125. otl_base_validate( OTL_Bytes table,
  126. OTL_Validator valid )
  127. {
  128. OTL_Bytes p = table;
  129. OTL_CHECK(6);
  130. if ( OTL_NEXT_ULONG( p ) != 0x10000UL )
  131. OTL_INVALID_DATA;
  132. otl_axis_table_validate( table + OTL_NEXT_USHORT( p ) );
  133. otl_axis_table_validate( table + OTL_NEXT_USHORT( p ) );
  134. }