text: /*
    +----------------------------------------------------------------------+
    | PHP Version 7                                                        |
    +----------------------------------------------------------------------+
    | Copyright (c) 1997-2018 The PHP Group                                |
    +----------------------------------------------------------------------+
    | This source file is subject to version 3.01 of the PHP license,      |
    | that is bundled with this package in the file LICENSE, and is        |
    | available through the world-wide-web at the following url:           |
    | http://www.php.net/license/3_01.txt                                  |
    | If you did not receive a copy of the PHP license and are unable to   |
    | obtain it through the world-wide-web, please send a note to          |
    | license@php.net so we can mail you a copy immediately.               |
    +----------------------------------------------------------------------+
    | Author:                                                              |
    +----------------------------------------------------------------------+
  */
  
  /* $Id$ */
  
  extern "C" {
  	#ifdef HAVE_CONFIG_H
  	#include "config.h"
  	#endif
  
  	#include "php.h"
  	#include "php_ini.h"
  	#include "ext/standard/info.h"
  }
  #include "php_pdlib.h"
  #include "src/chinese_whispers.h"
  #include "src/face_detection.h"
  #include "src/face_recognition.h"
  #include "src/cnn_face_detection.h"
  #include "src/face_landmark_detection.h"
  #include "src/vector.h"
  
  #include <dlib/revision.h>
  
  /* If you declare any globals in php_pdlib.h uncomment this:
  ZEND_DECLARE_MODULE_GLOBALS(pdlib)
  */
  
  static zend_class_entry *cnn_face_detection_ce = nullptr;
  static zend_object_handlers cnn_face_detection_obj_handlers;
  
  static zend_class_entry *face_landmark_detection_ce = nullptr;
  static zend_object_handlers face_landmark_detection_obj_handlers;
  
  static zend_class_entry *face_recognition_ce = nullptr;
  static zend_object_handlers face_recognition_obj_handlers;
  
  /* {{{ PHP_INI
   */
  /* Remove comments and fill if you need to have entries in php.ini
  PHP_INI_BEGIN()
      STD_PHP_INI_ENTRY("pdlib.global_value",      "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_pdlib_globals, pdlib_globals)
      STD_PHP_INI_ENTRY("pdlib.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_pdlib_globals, pdlib_globals)
  PHP_INI_END()
  */
  /* }}} */
  
  
  /* {{{ php_pdlib_init_globals
   */
  /* Uncomment this function if you have INI entries
  static void php_pdlib_init_globals(zend_pdlib_globals *pdlib_globals)
  {
  	pdlib_globals->global_value = 0;
  	pdlib_globals->global_string = NULL;
  }
  */
  /* }}} */
  
  const zend_function_entry cnn_face_detection_class_methods[] = {
  	PHP_ME(CnnFaceDetection, __construct, cnn_face_detection_ctor_arginfo, ZEND_ACC_PUBLIC)
  	PHP_ME(CnnFaceDetection, detect, cnn_face_detection_detect_arginfo, ZEND_ACC_PUBLIC)
  	PHP_FE_END
  };
  
  zend_object* php_cnn_face_detection_new(zend_class_entry *class_type)
  {
  	cnn_face_detection *cfd = (cnn_face_detection*)ecalloc(1, sizeof(cnn_face_detection));
  	zend_object_std_init(&cfd->std, class_type);
  	object_properties_init(&cfd->std, class_type);
  	cfd->std.handlers = &cnn_face_detection_obj_handlers; //zend_get_std_object_handlers();
  
  	return &cfd->std;
  }
  
  static void php_cnn_face_detection_free(zend_object *object)
  {
  	cnn_face_detection *cfd = (cnn_face_detection*)((char*)object - XtOffsetOf(cnn_face_detection, std));
  	delete cfd->net;
  	zend_object_std_dtor(object);
  }
  
  const zend_function_entry face_landmark_detection_class_methods[] = {
  	PHP_ME(FaceLandmarkDetection, __construct, face_landmark_detection_ctor_arginfo, ZEND_ACC_PUBLIC)
  	PHP_ME(FaceLandmarkDetection, detect, face_landmark_detection_detect_arginfo, ZEND_ACC_PUBLIC)
  	PHP_FE_END
  };
  
  zend_object* php_face_landmark_detection_new(zend_class_entry *class_type)
  {
  	face_landmark_detection *fld = (face_landmark_detection*)ecalloc(1, sizeof(face_landmark_detection));
  	zend_object_std_init(&fld->std, class_type);
  	object_properties_init(&fld->std, class_type);
  	fld->std.handlers = &face_landmark_detection_obj_handlers;
  
  	return &fld->std;
  }
  
  static void php_face_landmark_detection_free(zend_object *object)
  {
  	face_landmark_detection *fld = (face_landmark_detection*)((char*)object - XtOffsetOf(face_landmark_detection, std));
  	delete fld->sp;
  	zend_object_std_dtor(object);
  }
  
  const zend_function_entry face_recognition_class_methods[] = {
  	PHP_ME(FaceRecognition, __construct, face_recognition_ctor_arginfo, ZEND_ACC_PUBLIC)
  	PHP_ME(FaceRecognition, computeDescriptor, face_recognition_compute_descriptor_arginfo, ZEND_ACC_PUBLIC)
  	PHP_FE_END
  };
  
  zend_object* php_face_recognition_new(zend_class_entry *class_type)
  {
  	face_recognition *fr = (face_recognition*)ecalloc(1, sizeof(face_recognition));
  	zend_object_std_init(&fr->std, class_type);
  	object_properties_init(&fr->std, class_type);
  	fr->std.handlers = &face_recognition_obj_handlers;
  
  	return &fr->std;
  }
  
  static void php_face_recognition_free(zend_object *object)
  {
  	face_recognition *fr = (face_recognition*)((char*)object - XtOffsetOf(face_recognition, std));
  	delete fr->net;
  	zend_object_std_dtor(object);
  }
  
  /* {{{ PHP_MINIT_FUNCTION
   */
  PHP_MINIT_FUNCTION(pdlib)
  {
  	zend_class_entry ce;
  	// CnnFaceDetection class definition
  	//
  	INIT_CLASS_ENTRY(ce, "CnnFaceDetection", cnn_face_detection_class_methods);
  	cnn_face_detection_ce = zend_register_internal_class(&ce);
  	cnn_face_detection_ce->create_object = php_cnn_face_detection_new;
  	memcpy(&cnn_face_detection_obj_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
  	cnn_face_detection_obj_handlers.offset = XtOffsetOf(cnn_face_detection, std);
  	cnn_face_detection_obj_handlers.free_obj = php_cnn_face_detection_free;
  
  	// FaceLandmarkDetection class definition
  	//
  	INIT_CLASS_ENTRY(ce, "FaceLandmarkDetection", face_landmark_detection_class_methods);
  	face_landmark_detection_ce = zend_register_internal_class(&ce);
  	face_landmark_detection_ce->create_object = php_face_landmark_detection_new;
  	memcpy(&face_landmark_detection_obj_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
  	face_landmark_detection_obj_handlers.offset = XtOffsetOf(face_landmark_detection, std);
  	face_landmark_detection_obj_handlers.free_obj = php_face_landmark_detection_free;
  
  	// FaceRecognition class definition
  	//
  	INIT_CLASS_ENTRY(ce, "FaceRecognition", face_recognition_class_methods);
  	face_recognition_ce = zend_register_internal_class(&ce);
  	face_recognition_ce->create_object = php_face_recognition_new;
  	memcpy(&face_recognition_obj_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
  	face_recognition_obj_handlers.offset = XtOffsetOf(face_recognition, std);
  	face_recognition_obj_handlers.free_obj = php_face_recognition_free;
  
  	/* If you have INI entries, uncomment these lines
  	REGISTER_INI_ENTRIES();
  	*/
  	return SUCCESS;
  }
  
  /* }}} */
  
  /* {{{ PHP_MSHUTDOWN_FUNCTION
   */
  PHP_MSHUTDOWN_FUNCTION(pdlib)
  {
  	/* uncomment this line if you have INI entries
  	UNREGISTER_INI_ENTRIES();
  	*/
  	return SUCCESS;
  }
  /* }}} */
  
  /* Remove if there's nothing to do at request start */
  /* {{{ PHP_RINIT_FUNCTION
   */
  PHP_RINIT_FUNCTION(pdlib)
  {
  #if defined(COMPILE_DL_PDLIB) && defined(ZTS)
  	ZEND_TSRMLS_CACHE_UPDATE();
  #endif
  	return SUCCESS;
  }
  /* }}} */
  
  /* Remove if there's nothing to do at request end */
  /* {{{ PHP_RSHUTDOWN_FUNCTION
   */
  PHP_RSHUTDOWN_FUNCTION(pdlib)
  {
  	return SUCCESS;
  }
  /* }}} */
  
  /* {{{ PHP_MINFO_FUNCTION
   */
  PHP_MINFO_FUNCTION(pdlib)
  {
  	char buf[32];
  
  	php_info_print_table_start();
  	php_info_print_table_header(2, "pdlib support", "enabled");
  	php_info_print_table_row(2, "pdlib extension version", PHP_PDLIB_VERSION);
  	snprintf(buf, sizeof(buf), "%d.%d.%d", DLIB_MAJOR_VERSION, DLIB_MINOR_VERSION, DLIB_PATCH_VERSION);
  	php_info_print_table_row(2, "dlib library version", buf);
  #ifdef DLIB_USE_CUDA
  	php_info_print_table_header(2, "DLIB_USE_CUDA", "true");
  #else
  	php_info_print_table_header(2, "DLIB_USE_CUDA", "false");
  #endif
  #ifdef DLIB_USE_BLAS
  	php_info_print_table_header(2, "DLIB_USE_BLAS", "true");
  #else
  	php_info_print_table_header(2, "DLIB_USE_BLAS", "false");
  #endif
  #ifdef DLIB_USE_LAPACK
  	php_info_print_table_header(2, "DLIB_USE_LAPACK", "true");
  #else
  	php_info_print_table_header(2, "DLIB_USE_LAPACK", "false");
  #endif
  #ifdef DLIB_HAVE_AVX
  	php_info_print_table_header(2, "USE_AVX_INSTRUCTIONS", "true");
  #else
  	php_info_print_table_header(2, "USE_AVX_INSTRUCTIONS", "false");
  #endif
  #ifdef DLIB_HAVE_AVX2
  	php_info_print_table_header(2, "USE_AVX2_INSTRUCTIONS", "true");
  #else
  	php_info_print_table_header(2, "USE_AVX2_INSTRUCTIONS", "false");
  #endif
  #ifdef DLIB_HAVE_NEON
  	php_info_print_table_header(2, "USE_NEON_INSTRUCTIONS", "true");
  #else
  	php_info_print_table_header(2, "USE_NEON_INSTRUCTIONS", "false");
  #endif
  #ifdef DLIB_HAVE_SSE2
  	php_info_print_table_header(2, "USE_SSE2_INSTRUCTIONS", "true");
  #else
  	php_info_print_table_header(2, "USE_SSE2_INSTRUCTIONS", "false");
  #endif
  #ifdef DLIB_HAVE_SSE41
  	php_info_print_table_header(2, "USE_SSE4_INSTRUCTIONS", "true");
  #else
  	php_info_print_table_header(2, "USE_SSE4_INSTRUCTIONS", "false");
  #endif
  	php_info_print_table_end();
  
  	/* Remove comments if you have entries in php.ini
  	DISPLAY_INI_ENTRIES();
  	*/
  }
  /* }}} */
  
  /* {{{ pdlib_functions[]
   *
   * Every user visible function must have an entry in pdlib_functions[].
   */
  const zend_function_entry pdlib_functions[] = {
  	PHP_FE(dlib_chinese_whispers, dlib_chinese_whispers_arginfo)
  	PHP_FE(dlib_face_detection, dlib_face_detection_arginfo)
  	PHP_FE(dlib_face_landmark_detection, dlib_face_landmark_detection_arginfo)
  	PHP_FE(dlib_vector_length, dlib_vector_length_arginfo)
  	PHP_FE_END	/* Must be the last line in pdlib_functions[] */
  };
  /* }}} */
  
  /* {{{ pdlib_module_entry
   */
  zend_module_entry pdlib_module_entry = {
  	STANDARD_MODULE_HEADER,
  	PHP_PDLIB_NAME,
  	pdlib_functions,
  	PHP_MINIT(pdlib),
  	PHP_MSHUTDOWN(pdlib),
  	PHP_RINIT(pdlib),		/* Replace with NULL if there's nothing to do at request start */
  	PHP_RSHUTDOWN(pdlib),	/* Replace with NULL if there's nothing to do at request end */
  	PHP_MINFO(pdlib),
  	PHP_PDLIB_VERSION,
  	STANDARD_MODULE_PROPERTIES
  };
  /* }}} */
  
  #ifdef COMPILE_DL_PDLIB
  #ifdef ZTS
  ZEND_TSRMLS_CACHE_DEFINE()
  #endif
  ZEND_GET_MODULE(pdlib)
  #endif
  
  /*
   * Local variables:
   * tab-width: 4
   * c-basic-offset: 4
   * End:
   * vim600: noet sw=4 ts=4 fdm=marker
   * vim<600: noet sw=4 ts=4
   */
  