/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * 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.
 */

#pragma once

// Some FreeBSD source includes <complex.h> and assumes <math.h> from that.
#include <math.h>
#include <float.h>

#define __weak_reference(sym,alias)     \
    __asm__(".weak " #alias);           \
    __asm__(".equ "  #alias ", " #sym)

#define __strong_reference(sym,aliassym) \
    extern __typeof (sym) aliassym __attribute__ ((__alias__ (#sym)))

#define __warn_references(sym,msg) /* ignored */

// digittoint is in BSD's <ctype.h>, but not ours, so we have a secret
// implementation in libm. We reuse parts of libm in the NDK's
// libandroid_support, where it's a static library, so we want all our
// "hidden" functions start with a double underscore --- being HIDDEN
// in the ELF sense is not sufficient.
#define digittoint __libm_digittoint
int digittoint(char ch);

// Similarly rename _scan_nan.
#define _scan_nan __libm_scan_nan
