spoofchecker_class.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*
  2. +----------------------------------------------------------------------+
  3. | This source file is subject to version 3.01 of the PHP license, |
  4. | that is bundled with this package in the file LICENSE, and is |
  5. | available through the world-wide-web at the following url: |
  6. | https://www.php.net/license/3_01.txt |
  7. | If you did not receive a copy of the PHP license and are unable to |
  8. | obtain it through the world-wide-web, please send a note to |
  9. | license@php.net so we can mail you a copy immediately. |
  10. +----------------------------------------------------------------------+
  11. | Authors: Scott MacVicar <scottmac@php.net> |
  12. +----------------------------------------------------------------------+
  13. */
  14. #include "spoofchecker_class.h"
  15. #include "spoofchecker_arginfo.h"
  16. #include "php_intl.h"
  17. #include "intl_error.h"
  18. #include <unicode/uspoof.h>
  19. zend_class_entry *Spoofchecker_ce_ptr = NULL;
  20. static zend_object_handlers Spoofchecker_handlers;
  21. /*
  22. * Auxiliary functions needed by objects of 'Spoofchecker' class
  23. */
  24. /* {{{ Spoofchecker_objects_free */
  25. void Spoofchecker_objects_free(zend_object *object)
  26. {
  27. Spoofchecker_object* co = php_intl_spoofchecker_fetch_object(object);
  28. zend_object_std_dtor(&co->zo);
  29. spoofchecker_object_destroy(co);
  30. }
  31. /* }}} */
  32. /* {{{ Spoofchecker_object_create */
  33. zend_object *Spoofchecker_object_create(zend_class_entry *ce)
  34. {
  35. Spoofchecker_object* intern;
  36. intern = zend_object_alloc(sizeof(Spoofchecker_object), ce);
  37. intl_error_init(SPOOFCHECKER_ERROR_P(intern));
  38. zend_object_std_init(&intern->zo, ce);
  39. object_properties_init(&intern->zo, ce);
  40. intern->zo.handlers = &Spoofchecker_handlers;
  41. return &intern->zo;
  42. }
  43. /* }}} */
  44. /*
  45. * 'Spoofchecker' class registration structures & functions
  46. */
  47. /* {{{ Spoofchecker_class_functions
  48. * Every 'Spoofchecker' class method has an entry in this table
  49. */
  50. static zend_object *spoofchecker_clone_obj(zend_object *object) /* {{{ */
  51. {
  52. zend_object *new_obj_val;
  53. Spoofchecker_object *sfo, *new_sfo;
  54. sfo = php_intl_spoofchecker_fetch_object(object);
  55. intl_error_reset(SPOOFCHECKER_ERROR_P(sfo));
  56. new_obj_val = Spoofchecker_ce_ptr->create_object(object->ce);
  57. new_sfo = php_intl_spoofchecker_fetch_object(new_obj_val);
  58. /* clone standard parts */
  59. zend_objects_clone_members(&new_sfo->zo, &sfo->zo);
  60. /* clone internal object */
  61. new_sfo->uspoof = uspoof_clone(sfo->uspoof, SPOOFCHECKER_ERROR_CODE_P(new_sfo));
  62. if(U_FAILURE(SPOOFCHECKER_ERROR_CODE(new_sfo))) {
  63. /* set up error in case error handler is interested */
  64. intl_error_set( NULL, SPOOFCHECKER_ERROR_CODE(new_sfo), "Failed to clone SpoofChecker object", 0 );
  65. Spoofchecker_objects_free(&new_sfo->zo); /* free new object */
  66. zend_error(E_ERROR, "Failed to clone SpoofChecker object");
  67. }
  68. return new_obj_val;
  69. }
  70. /* }}} */
  71. /* {{{ spoofchecker_register_Spoofchecker_class
  72. * Initialize 'Spoofchecker' class
  73. */
  74. void spoofchecker_register_Spoofchecker_class(void)
  75. {
  76. /* Create and register 'Spoofchecker' class. */
  77. Spoofchecker_ce_ptr = register_class_Spoofchecker();
  78. Spoofchecker_ce_ptr->create_object = Spoofchecker_object_create;
  79. memcpy(&Spoofchecker_handlers, &std_object_handlers,
  80. sizeof Spoofchecker_handlers);
  81. Spoofchecker_handlers.offset = XtOffsetOf(Spoofchecker_object, zo);
  82. Spoofchecker_handlers.clone_obj = spoofchecker_clone_obj;
  83. Spoofchecker_handlers.free_obj = Spoofchecker_objects_free;
  84. }
  85. /* }}} */
  86. /* {{{ void spoofchecker_object_init( Spoofchecker_object* co )
  87. * Initialize internals of Spoofchecker_object.
  88. * Must be called before any other call to 'spoofchecker_object_...' functions.
  89. */
  90. void spoofchecker_object_init(Spoofchecker_object* co)
  91. {
  92. if (!co) {
  93. return;
  94. }
  95. intl_error_init(SPOOFCHECKER_ERROR_P(co));
  96. }
  97. /* }}} */
  98. /* {{{ void spoofchecker_object_destroy( Spoofchecker_object* co )
  99. * Clean up mem allocted by internals of Spoofchecker_object
  100. */
  101. void spoofchecker_object_destroy(Spoofchecker_object* co)
  102. {
  103. if (!co) {
  104. return;
  105. }
  106. if (co->uspoof) {
  107. uspoof_close(co->uspoof);
  108. co->uspoof = NULL;
  109. }
  110. intl_error_reset(SPOOFCHECKER_ERROR_P(co));
  111. }
  112. /* }}} */