/*
 * Copyright (C) 2005 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.
 */

//
// Handy utility functions and portability code.
//
#ifndef _LIBS_UTILS_MISC_H
#define _LIBS_UTILS_MISC_H

#include <sys/time.h>
#include <utils/Endian.h>

namespace android {

/* get #of elements in a static array */
#ifndef NELEM
# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
#endif

/*
 * Make a copy of the string, using "new[]" instead of "malloc".  Free the
 * string with delete[].
 *
 * Returns NULL if "str" is NULL.
 */
char* strdupNew(const char* str);

/*
 * Concatenate an argument vector into a single string.  If argc is >= 0
 * it will be used; if it's < 0 then the last element in the arg vector
 * must be NULL.
 *
 * This inserts a space between each argument.
 *
 * This does not automatically add double quotes around arguments with
 * spaces in them.  This practice is necessary for Win32, because Win32's
 * CreateProcess call is stupid.
 *
 * The caller should delete[] the returned string.
 */
char* concatArgv(int argc, const char* const argv[]);

/*
 * Count up the number of arguments in "argv".  The count does not include
 * the final NULL entry.
 */
int countArgv(const char* const argv[]);

/*
 * Some utility functions for working with files.  These could be made
 * part of a "File" class.
 */
typedef enum FileType {
    kFileTypeUnknown = 0,
    kFileTypeNonexistent,       // i.e. ENOENT
    kFileTypeRegular,
    kFileTypeDirectory,
    kFileTypeCharDev,
    kFileTypeBlockDev,
    kFileTypeFifo,
    kFileTypeSymlink,
    kFileTypeSocket,
} FileType;
/* get the file's type; follows symlinks */
FileType getFileType(const char* fileName);
/* get the file's modification date; returns -1 w/errno set on failure */
time_t getFileModDate(const char* fileName);

/*
 * Round up to the nearest power of 2.  Handy for hash tables.
 */
unsigned int roundUpPower2(unsigned int val);

void strreverse(char* begin, char* end);
void k_itoa(int value, char* str, int base);
char* itoa(int val, int base);

typedef void (*sysprop_change_callback)(void);
void add_sysprop_change_callback(sysprop_change_callback cb, int priority);
void report_sysprop_change();

}; // namespace android

#endif // _LIBS_UTILS_MISC_H
