Blame src/libmpg123/lfs_alias.c

Packit c32a2d
/*
Packit c32a2d
	lfs_alias: Aliases to the small/native API functions with the size of long int as suffix.
Packit c32a2d
Packit c32a2d
	copyright 2010-2013 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http://mpg123.org
Packit c32a2d
	initially written by Thomas Orgis
Packit c32a2d
Packit c32a2d
	Use case: Client code on Linux/x86-64 that defines _FILE_OFFSET_BITS to 64,
Packit c32a2d
	which is the only choice on that platform anyway. It should be no-op, but
Packit c32a2d
	prompts the platform-agnostic header of mpg123 to define API calls with the
Packit c32a2d
	corresponding suffix. This file provides the names for this case. It's cruft,
Packit c32a2d
	but glibc does it, too -- so people rely on it.
Packit c32a2d
	Oh, and it also caters for the lunatics that define _FILE_OFFSET_BITS=32 on
Packit c32a2d
	32 bit platforms. In addition, it's needed for platforms that always have
Packit c32a2d
	off_t /= long, and clients still insisting on defining _FILE_OFFSET_BITS.
Packit c32a2d
Packit c32a2d
	Depending on use case, the aliases map to 32 (small) or 64 bit (large) offset
Packit c32a2d
	functions, to the ones from libmpg123 or the ones from lfs_wrap.
Packit c32a2d
	
Packit c32a2d
	So, two basic cases:
Packit c32a2d
	1. mpg123_bla_32 alias for mpg123_bla (native)
Packit c32a2d
	2. mpg123_bla    alias for mpg123_bla_32 (wrapper)
Packit c32a2d
	Same for 64 bits. Confusing, I know. It sucks.
Packit c32a2d
Packit c32a2d
	Note that the mpg123 header is _not_ used here to avoid definition with whacky off_t.
Packit c32a2d
	The aliases are always about arguments of native alias_t type. This can be off_t, but
Packit c32a2d
	on Linux/x86, this is long int. The off_t declarations in mpg123.h confuse things,
Packit c32a2d
	so reproduce definitions for the wrapper functions in that case. The definitions are
Packit c32a2d
	pulled by an inline Perl script in any case ... no need to copy anything manually!
Packit c32a2d
	As a benefit, one can skip undefining possible largefile namings.
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#include "config.h"
Packit c32a2d
Packit c32a2d
/* Hack for Solaris: Some system headers included from compat.h might force _FILE_OFFSET_BITS. Need to follow that here.
Packit c32a2d
   Also, want it around to have types defined. */
Packit c32a2d
#include "compat.h"
Packit c32a2d
Packit c32a2d
#ifndef LFS_ALIAS_BITS
Packit c32a2d
#error "I need the count of alias bits here."
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#define MACROCAT_REALLY(a, b) a ## b
Packit c32a2d
#define MACROCAT(a, b) MACROCAT_REALLY(a, b)
Packit c32a2d
Packit c32a2d
/* This is wicked switchery: Decide which way the aliases are facing. */
Packit c32a2d
Packit c32a2d
#if _FILE_OFFSET_BITS+0 == LFS_ALIAS_BITS
Packit c32a2d
Packit c32a2d
/* The native functions have suffix, the aliases not. */
Packit c32a2d
#define NATIVE_SUFFIX MACROCAT(_, _FILE_OFFSET_BITS)
Packit c32a2d
#define NATIVE_NAME(func) MACROCAT(func, NATIVE_SUFFIX)
Packit c32a2d
#define ALIAS_NAME(func) func
Packit c32a2d
Packit c32a2d
#else
Packit c32a2d
Packit c32a2d
/* The alias functions have suffix, the native ones not. */
Packit c32a2d
#define ALIAS_SUFFIX MACROCAT(_, LFS_ALIAS_BITS)
Packit c32a2d
#define ALIAS_NAME(func) MACROCAT(func, ALIAS_SUFFIX)
Packit c32a2d
#define NATIVE_NAME(func) func
Packit c32a2d
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
/* Copy of necessary definitions, actually just forward declarations. */
Packit c32a2d
struct mpg123_handle_struct;
Packit c32a2d
typedef struct mpg123_handle_struct mpg123_handle;
Packit c32a2d
Packit c32a2d
Packit c32a2d
/* Get attribute_align_arg, to stay safe. */
Packit c32a2d
#include "abi_align.h"
Packit c32a2d
Packit c32a2d
/*
Packit c32a2d
	Extract the list of functions we need wrappers for, pregenerating the wrappers for simple cases (inline script for nedit):
Packit c32a2d
perl -ne '
Packit c32a2d
if(/^\s*MPG123_EXPORT\s+(\S+)\s+(mpg123_\S+)\((.*)\);\s*$/)
Packit c32a2d
{
Packit c32a2d
	my $type = $1;
Packit c32a2d
	my $name = $2;
Packit c32a2d
	my $args = $3;
Packit c32a2d
	next unless ($type =~ /off_t/ or $args =~ /off_t/ or ($name =~ /open/ and $name ne mpg123_open_feed));
Packit c32a2d
	$type =~ s/off_t/lfs_alias_t/g;
Packit c32a2d
	my @nargs = ();
Packit c32a2d
	$args =~ s/off_t/lfs_alias_t/g;
Packit c32a2d
	foreach my $a (split(/,/, $args))
Packit c32a2d
	{
Packit c32a2d
		$a =~ s/^.*\s\**([a-z_]+)$/$1/;
Packit c32a2d
		push(@nargs, $a);
Packit c32a2d
	}
Packit c32a2d
	my $nargs = join(", ", @nargs);
Packit c32a2d
	$nargs = "Human: figure me out." if($nargs =~ /\(/);
Packit c32a2d
	print <
Packit c32a2d
Packit c32a2d
$type NATIVE_NAME($name)($args);
Packit c32a2d
$type attribute_align_arg ALIAS_NAME($name)($args)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME($name)($nargs);
Packit c32a2d
}
Packit c32a2d
EOT
Packit c32a2d
Packit c32a2d
}' < mpg123.h.in
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
int NATIVE_NAME(mpg123_open)(mpg123_handle *mh, const char *path);
Packit c32a2d
int attribute_align_arg ALIAS_NAME(mpg123_open)(mpg123_handle *mh, const char *path)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_open)(mh, path);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int NATIVE_NAME(mpg123_open_fd)(mpg123_handle *mh, int fd);
Packit c32a2d
int attribute_align_arg ALIAS_NAME(mpg123_open_fd)(mpg123_handle *mh, int fd)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_open_fd)(mh, fd);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int NATIVE_NAME(mpg123_open_handle)(mpg123_handle *mh, void *iohandle);
Packit c32a2d
int attribute_align_arg ALIAS_NAME(mpg123_open_handle)(mpg123_handle *mh, void *iohandle)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_open_handle)(mh, iohandle);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int NATIVE_NAME(mpg123_decode_frame)(mpg123_handle *mh, lfs_alias_t *num, unsigned char **audio, size_t *bytes);
Packit c32a2d
int attribute_align_arg ALIAS_NAME(mpg123_decode_frame)(mpg123_handle *mh, lfs_alias_t *num, unsigned char **audio, size_t *bytes)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_decode_frame)(mh, num, audio, bytes);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int NATIVE_NAME(mpg123_framebyframe_decode)(mpg123_handle *mh, lfs_alias_t *num, unsigned char **audio, size_t *bytes);
Packit c32a2d
int attribute_align_arg ALIAS_NAME(mpg123_framebyframe_decode)(mpg123_handle *mh, lfs_alias_t *num, unsigned char **audio, size_t *bytes)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_framebyframe_decode)(mh, num, audio, bytes);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
lfs_alias_t NATIVE_NAME(mpg123_framepos)(mpg123_handle *mh);
Packit c32a2d
lfs_alias_t attribute_align_arg ALIAS_NAME(mpg123_framepos)(mpg123_handle *mh)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_framepos)(mh);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
lfs_alias_t NATIVE_NAME(mpg123_tell)(mpg123_handle *mh);
Packit c32a2d
lfs_alias_t attribute_align_arg ALIAS_NAME(mpg123_tell)(mpg123_handle *mh)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_tell)(mh);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
lfs_alias_t NATIVE_NAME(mpg123_tellframe)(mpg123_handle *mh);
Packit c32a2d
lfs_alias_t attribute_align_arg ALIAS_NAME(mpg123_tellframe)(mpg123_handle *mh)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_tellframe)(mh);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
lfs_alias_t NATIVE_NAME(mpg123_tell_stream)(mpg123_handle *mh);
Packit c32a2d
lfs_alias_t attribute_align_arg ALIAS_NAME(mpg123_tell_stream)(mpg123_handle *mh)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_tell_stream)(mh);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
lfs_alias_t NATIVE_NAME(mpg123_seek)(mpg123_handle *mh, lfs_alias_t sampleoff, int whence);
Packit c32a2d
lfs_alias_t attribute_align_arg ALIAS_NAME(mpg123_seek)(mpg123_handle *mh, lfs_alias_t sampleoff, int whence)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_seek)(mh, sampleoff, whence);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
lfs_alias_t NATIVE_NAME(mpg123_feedseek)(mpg123_handle *mh, lfs_alias_t sampleoff, int whence, lfs_alias_t *input_offset);
Packit c32a2d
lfs_alias_t attribute_align_arg ALIAS_NAME(mpg123_feedseek)(mpg123_handle *mh, lfs_alias_t sampleoff, int whence, lfs_alias_t *input_offset)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_feedseek)(mh, sampleoff, whence, input_offset);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
lfs_alias_t NATIVE_NAME(mpg123_seek_frame)(mpg123_handle *mh, lfs_alias_t frameoff, int whence);
Packit c32a2d
lfs_alias_t attribute_align_arg ALIAS_NAME(mpg123_seek_frame)(mpg123_handle *mh, lfs_alias_t frameoff, int whence)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_seek_frame)(mh, frameoff, whence);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
lfs_alias_t NATIVE_NAME(mpg123_timeframe)(mpg123_handle *mh, double sec);
Packit c32a2d
lfs_alias_t attribute_align_arg ALIAS_NAME(mpg123_timeframe)(mpg123_handle *mh, double sec)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_timeframe)(mh, sec);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int NATIVE_NAME(mpg123_index)(mpg123_handle *mh, lfs_alias_t **offsets, lfs_alias_t *step, size_t *fill);
Packit c32a2d
int attribute_align_arg ALIAS_NAME(mpg123_index)(mpg123_handle *mh, lfs_alias_t **offsets, lfs_alias_t *step, size_t *fill)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_index)(mh, offsets, step, fill);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int NATIVE_NAME(mpg123_set_index)(mpg123_handle *mh, lfs_alias_t *offsets, lfs_alias_t step, size_t fill);
Packit c32a2d
int attribute_align_arg ALIAS_NAME(mpg123_set_index)(mpg123_handle *mh, lfs_alias_t *offsets, lfs_alias_t step, size_t fill)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_set_index)(mh, offsets, step, fill);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int NATIVE_NAME(mpg123_position)( mpg123_handle *mh, lfs_alias_t frame_offset, lfs_alias_t buffered_bytes, lfs_alias_t *current_frame, lfs_alias_t *frames_left, double *current_seconds, double *seconds_left);
Packit c32a2d
int attribute_align_arg ALIAS_NAME(mpg123_position)( mpg123_handle *mh, lfs_alias_t frame_offset, lfs_alias_t buffered_bytes, lfs_alias_t *current_frame, lfs_alias_t *frames_left, double *current_seconds, double *seconds_left)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_position)(mh, frame_offset, buffered_bytes, current_frame, frames_left, current_seconds, seconds_left);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
lfs_alias_t NATIVE_NAME(mpg123_framelength)(mpg123_handle *mh);
Packit c32a2d
lfs_alias_t attribute_align_arg ALIAS_NAME(mpg123_framelength)(mpg123_handle *mh)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_framelength)(mh);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
lfs_alias_t NATIVE_NAME(mpg123_length)(mpg123_handle *mh);
Packit c32a2d
lfs_alias_t attribute_align_arg ALIAS_NAME(mpg123_length)(mpg123_handle *mh)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_length)(mh);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int NATIVE_NAME(mpg123_set_filesize)(mpg123_handle *mh, lfs_alias_t size);
Packit c32a2d
int attribute_align_arg ALIAS_NAME(mpg123_set_filesize)(mpg123_handle *mh, lfs_alias_t size)
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_set_filesize)(mh, size);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int NATIVE_NAME(mpg123_replace_reader)(mpg123_handle *mh, ssize_t (*r_read) (int, void *, size_t), lfs_alias_t (*r_lseek)(int, lfs_alias_t, int));
Packit c32a2d
int attribute_align_arg ALIAS_NAME(mpg123_replace_reader)(mpg123_handle *mh, ssize_t (*r_read) (int, void *, size_t), lfs_alias_t (*r_lseek)(int, lfs_alias_t, int))
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_replace_reader)(mh, r_read, r_lseek);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int NATIVE_NAME(mpg123_replace_reader_handle)(mpg123_handle *mh, ssize_t (*r_read) (void *, void *, size_t), lfs_alias_t (*r_lseek)(void *, lfs_alias_t, int), void (*cleanup)(void*));
Packit c32a2d
int attribute_align_arg ALIAS_NAME(mpg123_replace_reader_handle)(mpg123_handle *mh, ssize_t (*r_read) (void *, void *, size_t), lfs_alias_t (*r_lseek)(void *, lfs_alias_t, int), void (*cleanup)(void*))
Packit c32a2d
{
Packit c32a2d
	return NATIVE_NAME(mpg123_replace_reader_handle)(mh, r_read, r_lseek, cleanup);
Packit c32a2d
}
Packit c32a2d