Blame ports/MSVC++/2008clr/mpg123clr/string.cpp

Packit c32a2d
/*
Packit c32a2d
	mpg123clr: MPEG Audio Decoder library Common Language Runtime version.
Packit c32a2d

Packit c32a2d
	copyright 2009-2011 by Malcolm Boczek - free software under the terms of the LGPL 2.1
Packit c32a2d
	mpg123clr.dll is a derivative work of libmpg123 - all original mpg123 licensing terms apply.
Packit c32a2d

Packit c32a2d
	All rights to this work freely assigned to the mpg123 project.
Packit c32a2d
*/
Packit c32a2d
/*
Packit c32a2d
	libmpg123: MPEG Audio Decoder library
Packit c32a2d

Packit c32a2d
	copyright 1995-2011 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

Packit c32a2d
*/
Packit c32a2d
/*
Packit c32a2d
	1.8.1.0	04-Aug-09	Initial release.
Packit c32a2d
	1.9.0.0 24-Sep-09	Function names harmonized with libmpg123 (mb)
Packit c32a2d
	1.9.0.0 01-Oct-09	Technical cleanup - subst nullptr for NULL (mb)
Packit c32a2d
	1.13.0.0 13-Jan-11	release match - added strlen (mb)
Packit c32a2d
*/
Packit c32a2d

Packit c32a2d
#include "StdAfx.h"
Packit c32a2d
#include "string.h"
Packit c32a2d

Packit c32a2d
// Constructor for overlaid instance (instanced)
Packit c32a2d
mpg123clr::mpg123str::mpg123str(void)
Packit c32a2d
{
Packit c32a2d
	instanced = true;
Packit c32a2d
	sb = new ::mpg123_string;
Packit c32a2d
	mpg123_init_string();
Packit c32a2d

Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// Constructor for mpg123_string handle instance (referenced)
Packit c32a2d
mpg123clr::mpg123str::mpg123str(mpg123_string* sb)
Packit c32a2d
{
Packit c32a2d
	instanced = false;
Packit c32a2d
	this->sb = sb;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
mpg123clr::mpg123str::mpg123str(const char* str)
Packit c32a2d
{
Packit c32a2d
	instanced = true;
Packit c32a2d
	sb = new ::mpg123_string;
Packit c32a2d
	mpg123_init_string();
Packit c32a2d

Packit c32a2d
	::mpg123_set_string(sb, str);
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// Destructor cleans up all resources
Packit c32a2d
mpg123clr::mpg123str::~mpg123str(void)
Packit c32a2d
{
Packit c32a2d
	// clean up code to release managed resources
Packit c32a2d
	// ...
Packit c32a2d

Packit c32a2d
	// call Finalizer to clean up unmanaged resources
Packit c32a2d
	this->!mpg123str();
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
// Finalizer cleans up unmanaged resources
Packit c32a2d
mpg123clr::mpg123str::!mpg123str(void)
Packit c32a2d
{
Packit c32a2d
	if (instanced && (sb != nullptr)) mpg123_free_string();
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
int mpg123clr::mpg123str::mpg123_add_string(String ^ s)
Packit c32a2d
{
Packit c32a2d
	return mpg123_add_substring(s, 0, s->Length);
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
int mpg123clr::mpg123str::mpg123_add_substring(String ^ s, int from, int count)
Packit c32a2d
{
Packit c32a2d
	// convert CLR string to CLI string
Packit c32a2d
	using namespace Runtime::InteropServices;
Packit c32a2d
	const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s->Substring(from, count))).ToPointer();
Packit c32a2d

Packit c32a2d
	// add mpg123_string info
Packit c32a2d
	int ret = ::mpg123_add_string(sb, chars);
Packit c32a2d

Packit c32a2d
	// free temporary memory
Packit c32a2d
	Marshal::FreeHGlobal(IntPtr((void*)chars));
Packit c32a2d

Packit c32a2d
	return ret;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
int mpg123clr::mpg123str::mpg123_copy_string(mpg123str^ to)
Packit c32a2d
{
Packit c32a2d
	return ::mpg123_copy_string(sb, to->sb);
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
void mpg123clr::mpg123str::mpg123_free_string()
Packit c32a2d
{
Packit c32a2d
	::mpg123_free_string(sb);
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
int mpg123clr::mpg123str::mpg123_grow_string(int newSize)
Packit c32a2d
{
Packit c32a2d
	return ::mpg123_grow_string(sb, newSize);
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
int mpg123clr::mpg123str::mpg123_resize_string(int newSize)
Packit c32a2d
{
Packit c32a2d
	return ::mpg123_resize_string(sb, newSize);
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
void mpg123clr::mpg123str::mpg123_init_string()
Packit c32a2d
{
Packit c32a2d
	::mpg123_init_string(sb);
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
int mpg123clr::mpg123str::mpg123_set_string(String ^ s)
Packit c32a2d
{
Packit c32a2d
	return mpg123_set_substring(s, 0, s->Length);
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
int mpg123clr::mpg123str::mpg123_set_substring(String ^ s, int from, int count)
Packit c32a2d
{
Packit c32a2d
	// convert CLR string to CLI string
Packit c32a2d
	using namespace Runtime::InteropServices;
Packit c32a2d
	const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s->Substring(from, count))).ToPointer();
Packit c32a2d

Packit c32a2d
	// set mpg123_string info
Packit c32a2d
	int ret = ::mpg123_set_string(sb, chars);
Packit c32a2d

Packit c32a2d
	// free temporary memory
Packit c32a2d
	Marshal::FreeHGlobal(IntPtr((void*)chars));
Packit c32a2d

Packit c32a2d
	return ret;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
long long mpg123clr::mpg123str::mpg123_strlen(bool utf8)
Packit c32a2d
{
Packit c32a2d
	// TODO: determine use for utf8 vs ansi
Packit c32a2d
	return ::mpg123_strlen(sb, utf8);
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
int mpg123clr::mpg123str::Fill::get()
Packit c32a2d
{
Packit c32a2d
	// WARN 4267 - clr limited to 32bit-length-size strings by PtrToStringAnsi
Packit c32a2d
	return (int)sb->fill;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
int mpg123clr::mpg123str::Size::get()
Packit c32a2d
{
Packit c32a2d
	// WARN 4267 - clr limited to 32bit-length-size strings by PtrToStringAnsi
Packit c32a2d
	return (int)sb->size;
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
String^ mpg123clr::mpg123str::Text::get()
Packit c32a2d
{
Packit c32a2d
	if (sb->fill == 0) return gcnew String("");
Packit c32a2d

Packit c32a2d
	// WARN 4267 - clr limited to 32bit-length-size strings by PtrToStringAnsi
Packit c32a2d
	return Marshal::PtrToStringAnsi((IntPtr)sb->p, (int)strnlen(sb->p, sb->fill));
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
mpg123clr::mpg123str::text_encoding mpg123clr::mpg123str::mpg123_enc_from_id3(unsigned char id3_enc_byte)
Packit c32a2d
{
Packit c32a2d
	return (mpg123clr::mpg123str::text_encoding) ::mpg123_enc_from_id3(id3_enc_byte);
Packit c32a2d
}
Packit c32a2d

Packit c32a2d
int mpg123clr::mpg123str::mpg123_store_utf8(text_encoding enc, const unsigned char *source, size_t source_size)
Packit c32a2d
{
Packit c32a2d
	return ::mpg123_store_utf8(sb, (mpg123_text_encoding)enc, source, source_size);
Packit c32a2d
}