/******************************************************************************
 *
 *  Copyright 1998-2012 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

#include <string.h>

#include "bt_target.h"
#if (HL_INCLUDED == TRUE)

#include "bta_hl_int.h"
#include "osi/include/osi.h"
#include "sdp_api.h"
#include "utl.h"

/*******************************************************************************
 *
 * Function         bta_hl_fill_sup_feature_list
 *
 * Description      Fill the supported features from teh SDP record
 *
 * Returns          true if found, false if not
 *                  If found, the passed protocol list element is filled in.
 *
 ******************************************************************************/
bool bta_hl_fill_sup_feature_list(const tSDP_DISC_ATTR* p_attr,
                                  tBTA_HL_SUP_FEATURE_LIST_ELEM* p_list) {
  tSDP_DISC_ATTR* p_sattr;
  uint8_t item_cnt;
  uint8_t list_cnt = 0;
  bool status = true;

  for (p_attr = p_attr->attr_value.v.p_sub_attr; p_attr;
       p_attr = p_attr->p_next_attr) {
    /* mdep sequence */
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != DATA_ELE_SEQ_DESC_TYPE) {
      return (false);
    }

    item_cnt = 0;

    for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr && (item_cnt < 4);
         p_sattr = p_sattr->p_next_attr) {
      /* for each mdep list */

      p_list->list_elem[list_cnt].p_mdep_desp = NULL;
      switch (item_cnt) {
        case 0:
          p_list->list_elem[list_cnt].mdep_id = p_sattr->attr_value.v.u8;
          break;
        case 1:
          p_list->list_elem[list_cnt].data_type = p_sattr->attr_value.v.u16;
          break;
        case 2:
          p_list->list_elem[list_cnt].mdep_role =
              (tBTA_HL_MDEP_ROLE)p_sattr->attr_value.v.u8;
          break;
        case 3:
          p_list->list_elem[list_cnt].p_mdep_desp =
              (char*)p_sattr->attr_value.v.array;
          break;
      }

      item_cnt++;
    }
    list_cnt++;
  }
  p_list->num_elems = list_cnt;
  return (status);
}

/*******************************************************************************
 *
 * Function         bta_hl_compose_supported_feature_list
 *
 * Description      This function is called to compose a data sequence from
 *                  the supported  feature element list struct pointer
 *
 * Returns          the length of the data sequence
 *
 ******************************************************************************/
int bta_hl_compose_supported_feature_list(
    uint8_t* p, uint16_t num_elem,
    const tBTA_HL_SUP_FEATURE_ELEM* p_elem_list) {
  uint16_t xx, str_len, seq_len;
  uint8_t* p_head = p;

  for (xx = 0; xx < num_elem; xx++, p_elem_list++) {
    UINT8_TO_BE_STREAM(p, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
    seq_len = 7;
    str_len = 0;
    if (p_elem_list->p_mdep_desp) {
      str_len = strlen(p_elem_list->p_mdep_desp) + 1;
      seq_len += str_len + 2; /* todo add a # symbol for 2 */
    }

    *p++ = (uint8_t)seq_len;

    UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_ONE_BYTE);
    UINT8_TO_BE_STREAM(p, p_elem_list->mdep_id);
    UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
    UINT16_TO_BE_STREAM(p, p_elem_list->data_type);
    UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_ONE_BYTE);
    UINT8_TO_BE_STREAM(p, p_elem_list->mdep_role);

    if (str_len) {
      UINT8_TO_BE_STREAM(p, (TEXT_STR_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
      UINT8_TO_BE_STREAM(p, str_len);
      ARRAY_TO_BE_STREAM(p, p_elem_list->p_mdep_desp, str_len);
    }
  }

  return (p - p_head);
}

/*******************************************************************************
 *
 * Function         bta_hl_add_sup_feature_list
 *
 * Description      This function is called to add a protocol descriptor list to
 *                  a record. This would be through the SDP database maintenance
 *                  API. If the protocol list already exists in the record, it
 *                  is replaced with the new list.
 *
 * Returns          true if added OK, else false
 *
 ******************************************************************************/
bool bta_hl_add_sup_feature_list(uint32_t handle, uint16_t num_elem,
                                 const tBTA_HL_SUP_FEATURE_ELEM* p_elem_list) {
  int offset;
  bool result;
  uint8_t* p_buf = (uint8_t*)osi_malloc(BTA_HL_SUP_FEATURE_SDP_BUF_SIZE);

  offset = bta_hl_compose_supported_feature_list(p_buf, num_elem, p_elem_list);
  result = SDP_AddAttribute(handle, ATTR_ID_HDP_SUP_FEAT_LIST,
                            DATA_ELE_SEQ_DESC_TYPE, (uint32_t)offset, p_buf);
  osi_free(p_buf);

  return result;
}

/*****************************************************************************
 *
 *  Function:    bta_hl_sdp_update
 *
 *  Purpose:     Register an HDP application with SDP
 *
 *  Parameters:
 *
 *  Returns:     void
 *
 ****************************************************************************/
tBTA_HL_STATUS bta_hl_sdp_update(UNUSED_ATTR uint8_t app_id) {
  uint16_t svc_class_id_list[BTA_HL_NUM_SVC_ELEMS];
  tSDP_PROTOCOL_ELEM proto_elem_list[BTA_HL_NUM_PROTO_ELEMS];
  tSDP_PROTO_LIST_ELEM add_proto_list;
  tBTA_HL_SUP_FEATURE_LIST_ELEM sup_feature_list;
  uint16_t browse_list[] = {UUID_SERVCLASS_PUBLIC_BROWSE_GROUP};
  uint8_t i, j, cnt, mdep_id, mdep_role;
  uint8_t data_exchange_spec = BTA_HL_SDP_IEEE_11073_20601;
  uint8_t mcap_sup_proc = BTA_HL_MCAP_SUP_PROC_MASK;
  uint16_t profile_uuid = UUID_SERVCLASS_HDP_PROFILE;
  uint16_t version = BTA_HL_VERSION;
  uint8_t num_services = 1;
  tBTA_HL_APP_CB* p_cb = BTA_HL_GET_APP_CB_PTR(0);
  bool result = true;
  tBTA_HL_STATUS status = BTA_HL_STATUS_OK;

  if ((p_cb->sup_feature.app_role_mask == BTA_HL_MDEP_ROLE_MASK_SOURCE) &&
      (!p_cb->sup_feature.advertize_source_sdp)) {
    return BTA_HL_STATUS_OK;
  }

  num_services = 1;
  svc_class_id_list[0] = UUID_SERVCLASS_HDP_SOURCE;
  if (p_cb->sup_feature.app_role_mask == BTA_HL_MDEP_ROLE_MASK_SINK) {
    svc_class_id_list[0] = UUID_SERVCLASS_HDP_SINK;
  } else {
    if (p_cb->sup_feature.app_role_mask != BTA_HL_MDEP_ROLE_MASK_SOURCE) {
      /* dual role */
      num_services = 2;
      svc_class_id_list[1] = UUID_SERVCLASS_HDP_SINK;
    }
  }
  result &= SDP_AddServiceClassIdList(p_cb->sdp_handle, num_services,
                                      svc_class_id_list);

  if (result) {
    /* add the protocol element sequence */
    proto_elem_list[0].protocol_uuid = UUID_PROTOCOL_L2CAP;
    proto_elem_list[0].num_params = 1;
    proto_elem_list[0].params[0] = p_cb->ctrl_psm;
    proto_elem_list[1].protocol_uuid = UUID_PROTOCOL_MCAP_CTRL;
    proto_elem_list[1].num_params = 1;
    proto_elem_list[1].params[0] = version;
    result &= SDP_AddProtocolList(p_cb->sdp_handle, BTA_HL_NUM_PROTO_ELEMS,
                                  proto_elem_list);

    result &=
        SDP_AddProfileDescriptorList(p_cb->sdp_handle, profile_uuid, version);
  }

  if (result) {
    add_proto_list.num_elems = BTA_HL_NUM_ADD_PROTO_ELEMS;
    add_proto_list.list_elem[0].protocol_uuid = UUID_PROTOCOL_L2CAP;
    add_proto_list.list_elem[0].num_params = 1;
    add_proto_list.list_elem[0].params[0] = p_cb->data_psm;
    add_proto_list.list_elem[1].protocol_uuid = UUID_PROTOCOL_MCAP_DATA;
    add_proto_list.list_elem[1].num_params = 0;
    result &= SDP_AddAdditionProtoLists(
        p_cb->sdp_handle, BTA_HL_NUM_ADD_PROTO_LISTS, &add_proto_list);
  }

  if (result) {
    if (p_cb->srv_name[0]) {
      result &= SDP_AddAttribute(
          p_cb->sdp_handle, (uint16_t)ATTR_ID_SERVICE_NAME,
          (uint8_t)TEXT_STR_DESC_TYPE, (uint32_t)(strlen(p_cb->srv_name) + 1),
          (uint8_t*)p_cb->srv_name);
    } /* end of setting optional service name */
  }

  if (result) {
    if (p_cb->srv_desp[0]) {
      result &= SDP_AddAttribute(
          p_cb->sdp_handle, (uint16_t)ATTR_ID_SERVICE_DESCRIPTION,
          (uint8_t)TEXT_STR_DESC_TYPE, (uint32_t)(strlen(p_cb->srv_desp) + 1),
          (uint8_t*)p_cb->srv_desp);

    } /* end of setting optional service description */
  }

  if (result) {
    if (p_cb->provider_name[0]) {
      result &=
          SDP_AddAttribute(p_cb->sdp_handle, (uint16_t)ATTR_ID_PROVIDER_NAME,
                           (uint8_t)TEXT_STR_DESC_TYPE,
                           (uint32_t)(strlen(p_cb->provider_name) + 1),
                           (uint8_t*)p_cb->provider_name);
    } /* end of setting optional provider name */
  }

  /* add supported feture list */

  if (result) {
    cnt = 0;
    for (i = 1; i < BTA_HL_NUM_MDEPS; i++) {
      if (p_cb->sup_feature.mdep[i].mdep_id) {
        mdep_id = (uint8_t)p_cb->sup_feature.mdep[i].mdep_id;
        mdep_role = (uint8_t)p_cb->sup_feature.mdep[i].mdep_cfg.mdep_role;

        APPL_TRACE_DEBUG(
            "num_of_mdep_data_types %d ",
            p_cb->sup_feature.mdep[i].mdep_cfg.num_of_mdep_data_types);
        for (j = 0;
             j < p_cb->sup_feature.mdep[i].mdep_cfg.num_of_mdep_data_types;
             j++) {
          sup_feature_list.list_elem[cnt].mdep_id = mdep_id;
          sup_feature_list.list_elem[cnt].mdep_role = mdep_role;
          sup_feature_list.list_elem[cnt].data_type =
              p_cb->sup_feature.mdep[i].mdep_cfg.data_cfg[j].data_type;
          if (p_cb->sup_feature.mdep[i].mdep_cfg.data_cfg[j].desp[0] != '\0') {
            sup_feature_list.list_elem[cnt].p_mdep_desp =
                p_cb->sup_feature.mdep[i].mdep_cfg.data_cfg[j].desp;
          } else {
            sup_feature_list.list_elem[cnt].p_mdep_desp = NULL;
          }

          cnt++;
          if (cnt == BTA_HL_NUM_SUP_FEATURE_ELEMS) {
            result = false;
            break;
          }
        }
      }
    }
    sup_feature_list.num_elems = cnt;
    result &= bta_hl_add_sup_feature_list(p_cb->sdp_handle,
                                          sup_feature_list.num_elems,
                                          sup_feature_list.list_elem);
  }
  if (result) {
    result &= SDP_AddAttribute(p_cb->sdp_handle, ATTR_ID_HDP_DATA_EXCH_SPEC,
                               UINT_DESC_TYPE, (uint32_t)1,
                               (uint8_t*)&data_exchange_spec);
  }

  if (result) {
    result &=
        SDP_AddAttribute(p_cb->sdp_handle, ATTR_ID_HDP_MCAP_SUP_PROC,
                         UINT_DESC_TYPE, (uint32_t)1, (uint8_t*)&mcap_sup_proc);
  }

  if (result) {
    result &= SDP_AddUuidSequence(p_cb->sdp_handle, ATTR_ID_BROWSE_GROUP_LIST,
                                  1, browse_list);
  }

  if (result) {
    for (i = 0; i < num_services; i++) {
      bta_sys_add_uuid(svc_class_id_list[i]);
      APPL_TRACE_DEBUG("dbg bta_sys_add_uuid i=%d uuid=0x%x", i,
                       svc_class_id_list[i]);  // todo
    }
  } else {
    if (p_cb->sdp_handle) {
      SDP_DeleteRecord(p_cb->sdp_handle);
      p_cb->sdp_handle = 0;
    }
    status = BTA_HL_STATUS_SDP_FAIL;
  }
#if (BTA_HL_DEBUG == TRUE)
  APPL_TRACE_DEBUG("bta_hl_sdp_update status=%s", bta_hl_status_code(status));
#endif
  return status;
}

/*****************************************************************************
 *
 *  Function:    bta_hl_sdp_register
 *
 *  Purpose:     Register an HDP application with SDP
 *
 *  Parameters:  p_cb           - Pointer to MA instance control block
 *               p_service_name - MA server name
 *               inst_id        - MAS instance ID
 *               msg_type       - Supported message type(s)
 *
 *
 *  Returns:     void
 *
 ****************************************************************************/
tBTA_HL_STATUS bta_hl_sdp_register(uint8_t app_idx) {
  uint16_t svc_class_id_list[BTA_HL_NUM_SVC_ELEMS];
  tSDP_PROTOCOL_ELEM proto_elem_list[BTA_HL_NUM_PROTO_ELEMS];
  tSDP_PROTO_LIST_ELEM add_proto_list;
  tBTA_HL_SUP_FEATURE_LIST_ELEM sup_feature_list;
  uint16_t browse_list[] = {UUID_SERVCLASS_PUBLIC_BROWSE_GROUP};
  uint8_t i, j, cnt, mdep_id, mdep_role;
  uint8_t data_exchange_spec = BTA_HL_SDP_IEEE_11073_20601;
  uint8_t mcap_sup_proc = BTA_HL_MCAP_SUP_PROC_MASK;
  uint16_t profile_uuid = UUID_SERVCLASS_HDP_PROFILE;
  uint16_t version = BTA_HL_VERSION;
  uint8_t num_services = 1;
  tBTA_HL_APP_CB* p_cb = BTA_HL_GET_APP_CB_PTR(app_idx);
  bool result = true;
  tBTA_HL_STATUS status = BTA_HL_STATUS_OK;

#if (BTA_HL_DEBUG == TRUE)
  APPL_TRACE_DEBUG("bta_hl_sdp_register app_idx=%d", app_idx);
#endif

  if ((p_cb->sup_feature.app_role_mask == BTA_HL_MDEP_ROLE_MASK_SOURCE) &&
      (!p_cb->sup_feature.advertize_source_sdp)) {
    return BTA_HL_STATUS_OK;
  }

  p_cb->sdp_handle = SDP_CreateRecord();
  if (p_cb->sdp_handle == 0) {
    return BTA_HL_STATUS_SDP_NO_RESOURCE;
  }

  num_services = 1;
  svc_class_id_list[0] = UUID_SERVCLASS_HDP_SOURCE;
  if (p_cb->sup_feature.app_role_mask == BTA_HL_MDEP_ROLE_MASK_SINK) {
    svc_class_id_list[0] = UUID_SERVCLASS_HDP_SINK;
  } else {
    if (p_cb->sup_feature.app_role_mask != BTA_HL_MDEP_ROLE_MASK_SOURCE) {
      /* dual role */
      num_services = 2;
      svc_class_id_list[1] = UUID_SERVCLASS_HDP_SINK;
    }
  }
  result &= SDP_AddServiceClassIdList(p_cb->sdp_handle, num_services,
                                      svc_class_id_list);

  if (result) {
    /* add the protocol element sequence */
    proto_elem_list[0].protocol_uuid = UUID_PROTOCOL_L2CAP;
    proto_elem_list[0].num_params = 1;
    proto_elem_list[0].params[0] = p_cb->ctrl_psm;
    proto_elem_list[1].protocol_uuid = UUID_PROTOCOL_MCAP_CTRL;
    proto_elem_list[1].num_params = 1;
    proto_elem_list[1].params[0] = version;
    result &= SDP_AddProtocolList(p_cb->sdp_handle, BTA_HL_NUM_PROTO_ELEMS,
                                  proto_elem_list);

    result &=
        SDP_AddProfileDescriptorList(p_cb->sdp_handle, profile_uuid, version);
  }

  if (result) {
    add_proto_list.num_elems = BTA_HL_NUM_ADD_PROTO_ELEMS;
    add_proto_list.list_elem[0].protocol_uuid = UUID_PROTOCOL_L2CAP;
    add_proto_list.list_elem[0].num_params = 1;
    add_proto_list.list_elem[0].params[0] = p_cb->data_psm;
    add_proto_list.list_elem[1].protocol_uuid = UUID_PROTOCOL_MCAP_DATA;
    add_proto_list.list_elem[1].num_params = 0;
    result &= SDP_AddAdditionProtoLists(
        p_cb->sdp_handle, BTA_HL_NUM_ADD_PROTO_LISTS, &add_proto_list);
  }

  if (result) {
    if (p_cb->srv_name[0]) {
      result &= SDP_AddAttribute(
          p_cb->sdp_handle, (uint16_t)ATTR_ID_SERVICE_NAME,
          (uint8_t)TEXT_STR_DESC_TYPE, (uint32_t)(strlen(p_cb->srv_name) + 1),
          (uint8_t*)p_cb->srv_name);
    } /* end of setting optional service name */
  }

  if (result) {
    if (p_cb->srv_desp[0]) {
      result &= SDP_AddAttribute(
          p_cb->sdp_handle, (uint16_t)ATTR_ID_SERVICE_DESCRIPTION,
          (uint8_t)TEXT_STR_DESC_TYPE, (uint32_t)(strlen(p_cb->srv_desp) + 1),
          (uint8_t*)p_cb->srv_desp);

    } /* end of setting optional service description */
  }

  if (result) {
    if (p_cb->provider_name[0]) {
      result &=
          SDP_AddAttribute(p_cb->sdp_handle, (uint16_t)ATTR_ID_PROVIDER_NAME,
                           (uint8_t)TEXT_STR_DESC_TYPE,
                           (uint32_t)(strlen(p_cb->provider_name) + 1),
                           (uint8_t*)p_cb->provider_name);
    } /* end of setting optional provider name */
  }

  /* add supported feture list */

  if (result) {
    cnt = 0;
    for (i = 1; i <= p_cb->sup_feature.num_of_mdeps; i++) {
      mdep_id = (uint8_t)p_cb->sup_feature.mdep[i].mdep_id;
      mdep_role = (uint8_t)p_cb->sup_feature.mdep[i].mdep_cfg.mdep_role;

      for (j = 0; j < p_cb->sup_feature.mdep[i].mdep_cfg.num_of_mdep_data_types;
           j++) {
        sup_feature_list.list_elem[cnt].mdep_id = mdep_id;
        sup_feature_list.list_elem[cnt].mdep_role = mdep_role;
        sup_feature_list.list_elem[cnt].data_type =
            p_cb->sup_feature.mdep[i].mdep_cfg.data_cfg[j].data_type;
        if (p_cb->sup_feature.mdep[i].mdep_cfg.data_cfg[j].desp[0] != '\0') {
          sup_feature_list.list_elem[cnt].p_mdep_desp =
              p_cb->sup_feature.mdep[i].mdep_cfg.data_cfg[j].desp;
        } else {
          sup_feature_list.list_elem[cnt].p_mdep_desp = NULL;
        }

        cnt++;
        if (cnt == BTA_HL_NUM_SUP_FEATURE_ELEMS) {
          result = false;
          break;
        }
      }
    }
    sup_feature_list.num_elems = cnt;
    result &= bta_hl_add_sup_feature_list(p_cb->sdp_handle,
                                          sup_feature_list.num_elems,
                                          sup_feature_list.list_elem);
  }
  if (result) {
    result &= SDP_AddAttribute(p_cb->sdp_handle, ATTR_ID_HDP_DATA_EXCH_SPEC,
                               UINT_DESC_TYPE, (uint32_t)1,
                               (uint8_t*)&data_exchange_spec);
  }

  if (result) {
    result &=
        SDP_AddAttribute(p_cb->sdp_handle, ATTR_ID_HDP_MCAP_SUP_PROC,
                         UINT_DESC_TYPE, (uint32_t)1, (uint8_t*)&mcap_sup_proc);
  }

  if (result) {
    result &= SDP_AddUuidSequence(p_cb->sdp_handle, ATTR_ID_BROWSE_GROUP_LIST,
                                  1, browse_list);
  }

  if (result) {
    for (i = 0; i < num_services; i++) {
      bta_sys_add_uuid(svc_class_id_list[i]);
      APPL_TRACE_DEBUG("dbg bta_sys_add_uuid i=%d uuid=0x%x", i,
                       svc_class_id_list[i]);  // todo
    }
  } else {
    if (p_cb->sdp_handle) {
      SDP_DeleteRecord(p_cb->sdp_handle);
      p_cb->sdp_handle = 0;
    }
    status = BTA_HL_STATUS_SDP_FAIL;
  }
#if (BTA_HL_DEBUG == TRUE)
  APPL_TRACE_DEBUG("bta_hl_sdp_register status=%s", bta_hl_status_code(status));
#endif
  return status;
}

/*******************************************************************************
 *
 * Function         bta_hl_find_sink_or_src_srv_class_in_db
 *
 * Description      This function queries an SDP database for either a HDP Sink
 *                  or Source service class ID.
 *                  If the p_start_rec pointer is NULL, it looks from the
 *                  beginning of the database, else it continues from the next
 *                  record after p_start_rec.
 *
 * Returns          Pointer to record containing service class, or NULL
 *
 ******************************************************************************/
tSDP_DISC_REC* bta_hl_find_sink_or_src_srv_class_in_db(
    const tSDP_DISCOVERY_DB* p_db, const tSDP_DISC_REC* p_start_rec) {
  tSDP_DISC_REC* p_rec;
  tSDP_DISC_ATTR *p_attr, *p_sattr;

  /* Must have a valid database */
  if (p_db == NULL) return (NULL);

  if (!p_start_rec) {
    p_rec = p_db->p_first_rec;
  } else {
    p_rec = p_start_rec->p_next_rec;
  }

  while (p_rec) {
    p_attr = p_rec->p_first_attr;
    while (p_attr) {
      if ((p_attr->attr_id == ATTR_ID_SERVICE_CLASS_ID_LIST) &&
          (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) ==
           DATA_ELE_SEQ_DESC_TYPE)) {
        for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr;
             p_sattr = p_sattr->p_next_attr) {
          if ((SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE) &&
              (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 2) &&
              ((p_sattr->attr_value.v.u16 == UUID_SERVCLASS_HDP_SINK) ||
               (p_sattr->attr_value.v.u16 == UUID_SERVCLASS_HDP_SOURCE))) {
            return (p_rec);
          }
        }
        break;
      }

      p_attr = p_attr->p_next_attr;
    }

    p_rec = p_rec->p_next_rec;
  }
/* If here, no matching UUID found */

#if (BTA_HL_DEBUG == TRUE)
  APPL_TRACE_DEBUG("bta_hl_find_sink_or_src_srv_class_in_db failed");
#endif

  return (NULL);
}
#endif /* HL_INCLUDED */
