Files
winamp-mpris/Wawi Source/strings.cpp
ergosteur 22492dbee9 Implement XDG compliance, logging, and improved 401 error handling
- Install to ~/.local/bin/winamp-mpris
- Use ~/.local/state/winamp-mpris/bridge.log for logging
- Use $XDG_RUNTIME_DIR/winamp-mpris.pid for PID management
- Add detailed user notification for 401 Unauthorized errors
- Add install.sh for automated, standard-compliant setup
- Include Winamp Web Interface source code and installer in repository
2026-04-08 18:29:40 -04:00

266 lines
6.6 KiB
C++

/* --- STRINGS.CPP ---
/
/ Written by Phil Himsworth, 2001-2002.
/
/*/
#include <windows.h>
#include "wamessage.h"
#include "types.h"
#include "main.h"
// This would be so much easier if Clib didn't have memory leaks within CreateThread...
// Oh well, here are the random string doodles
// (And if I had found the Win32 string functions first...!)
// Returns a substring ending with the delimiter
char * GetDelimitedString(char * buffer, char delimiter, char * result, int result_len)
{
int ptr = 0;
while(buffer[ptr] != delimiter && ptr < result_len)
{
result[ptr] = buffer[ptr];
if (buffer[ptr] == 0) // Check for end of string
return NULL;
ptr++;
}
result[ptr] = 0;
return buffer+ptr;
}
// --------------------------------------------------------------------------------
// Gets a string not in quotes
bool GetUnquotedString(char * buffer, char * result, int result_len)
{
int resptr = 0, ptr = 0;
while(buffer[ptr] != ' ' && buffer[ptr] != ',' && buffer[ptr] != 0 && ptr != result_len) // copy string
{
result[resptr] = buffer[ptr];
ptr++;
resptr++;
}
result[resptr] = 0;
return true;
}
// --------------------------------------------------------------------------------
// Gets a string within quotes
bool GetQuotedString(char * buffer, char * result, int result_len)
{
int ptr = 0;
while(buffer[ptr] != '\"') // find first "
{
if (buffer[ptr] == 0) // end of string and no quote start found; fail
return false;
ptr++;
}
// ptr points to first "; move on 1 to start of string
ptr++;
int resptr = 0;
while(buffer[ptr] != '\"' && buffer[ptr] != 0 && ptr != result_len) // copy string until closing "
{ // or end of buffer
result[resptr] = buffer[ptr];
ptr++;
resptr++;
}
result[resptr] = 0; // make last char 0
return true;
}
// --------------------------------------------------------------------------------
// Checks if string2 begins with string1
bool StartString(char* string1, char* string2)
{
//char temp[2048];
//wsprintf(temp,"1: %s\n2:%s",string1,string2);
//MessageBox(NULL,temp,"gen_httpSrv StartString",MB_OK);
int ptr = 0;
while(ToLowerCase(string1[ptr]) == ToLowerCase(string2[ptr])) // Keep going until they're different
{
if (string1[ptr] == 0) // if string1 finishes, they're the same
return true;
ptr++;
}
if (string1[ptr] == 0) // If they're different because string1 has ended, yes
return true;
else
return false; // If they're different and string1 has not ended, no
}
// --------------------------------------------------------------------------------
// Retrieves next token from buffer
char * GetAString(char* chptr, char* text) // Old GetAString - only accepts single words
{
int bptr = 0;
int tptr = 0;
while (chptr[bptr] == ' ' || chptr[bptr] == '\n' || chptr[bptr] == '\r') // skip leading spaces and stuff
bptr++;
while (chptr[bptr] != 0 && chptr[bptr] != ' ' && chptr[bptr] != '\n' && chptr[bptr] != '\r' && bptr < 255) // while current char is a letter
{
text[tptr] = chptr[bptr]; // add letter to text[]
bptr++;
tptr++;
}
text[tptr] = 0;
chptr = chptr + bptr;
return chptr; // return pointer to the end of this string
}
// --------------------------------------------------------------------------------
// Mangles the time into a displayable format
void PrintTime(connection * conn, int mins,int seconds)
{
char tbuffer[20];
if (seconds<10) // Avoids it printing eg. '4:2' when it should be '4:02'
wsprintf(tbuffer,"%d:0%d",mins,seconds);
else
wsprintf(tbuffer,"%d:%d",mins,seconds);
prints(conn,tbuffer);
}
void PrintTrackTime(connection * conn)
{
int tracklen;
int trackpos = SendMessage(WAwnd(),WM_USER, 0, WAU_TRACKPOS) / 1000;
int mins = trackpos / 60;
int seconds = trackpos % 60;
prints(conn, " (");
PrintTime(conn,mins,seconds);
tracklen = SendMessage(WAwnd(),WM_USER, 1, WAU_TRACKLENGTH);
mins = tracklen / 60;
seconds = tracklen % 60;
prints(conn, " / ");
PrintTime(conn,mins,seconds);
prints(conn, ")\n\r");
}
// --------------------------------------------------------------------------------
// Convert a string to lower case
void ToLowerCase(char * string)
{
int i=0;
while (string[i] != 0 && i < 255)
{
if (string[i] >= 'A' && string[i] <= 'Z')
string[i] += 32;
i++;
}
}
// --------------------------------------------------------------------------------
// Convert a char to lower case
char ToLowerCase(char c)
{
if (c >= 'A' && c <= 'Z')
c += 32;
return c;
}
// --------------------------------------------------------------------------------
// Blatantly better Strcmp using win32 lstrcmp
bool StrComp(char * string1, char * string2)
{
if (lstrcmp(string1, string2) == 0) // Converts result from lstrcmp to a bool
return true;
else
return false;
}
// --------------------------------------------------------------------------------
// Converts '/' characters to '\'... it's Opera trying to be helpful, dammit!
void ReplaceSlashes(char * string)
{
int ptr=0;
while (string[ptr]!=0)
{
if (string[ptr]=='/')
string[ptr] = '\\';
ptr++;
}
}
// --------------------------------------------------------------------------------
// Retrieves a filename from a full path
char * GetFilename(char * path)
{
char * filename;
for (int i=0;path[i] != 0;i++)
if (path[i]=='\\')
filename = path+i;
return filename+1; // ignore leading slash
}
// --------------------------------------------------------------------------------
// Non-clib version of atoi
int atoi2(const char *str )
{
int val = 0, mlt = 1;
char *p;
p = (char *) (str + lstrlen( str ) - 1);
for( ; p >= str; --p, mlt *= 10 ) {
val += (mlt * ((int)*p - '0'));
}
return val;
}
// --------------------------------------------------------------------------------
// Checks if string contains a character
bool contains(char * echars,char ch)
{
int x=0;
while(echars[x] != 0)
{
if (echars[x] == ch)
return true;
x++;
}
return false;
}
// --------------------------------------------------------------------------------
// Finds substring
char * strstr2(char *string, char *substring)
{
char *a, *b;
b = substring;
if (*b == 0) {
return string;
}
for ( ; *string != 0; string += 1) {
if (*string != *b) {
continue;
}
a = string;
while (1) {
if (*b == 0) {
return string;
}
if (*a++ != *b++) {
break;
}
}
b = substring;
}
return NULL;
}