/* * Copyright (C) 2002-2010 The DOSBox Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* $Id: support.cpp,v 1.37 2009-05-27 09:15:42 qbix79 Exp $ */ #include #include #include #include #include #include #include #include #include #include #include "dosbox.h" #include "debug.h" #include "support.h" #include "video.h" void upcase(std::string &str) { int (*tf)(int) = std::toupper; std::transform(str.begin(), str.end(), str.begin(), tf); } void lowcase(std::string &str) { int (*tf)(int) = std::tolower; std::transform(str.begin(), str.end(), str.begin(), tf); } /* Ripped some source from freedos for this one. */ /* * replaces all instances of character o with character c */ void strreplace(char * str,char o,char n) { while (*str) { if (*str==o) *str=n; str++; } } char *ltrim(char *str) { while (*str && isspace(*reinterpret_cast(str))) str++; return str; } char *rtrim(char *str) { char *p; p = strchr(str, '\0'); while (--p >= str && isspace(*reinterpret_cast(p))) {}; p[1] = '\0'; return str; } char *trim(char *str) { return ltrim(rtrim(str)); } char * upcase(char * str) { for (char* idx = str; *idx ; idx++) *idx = toupper(*reinterpret_cast(idx)); return str; } char * lowcase(char * str) { for(char* idx = str; *idx ; idx++) *idx = tolower(*reinterpret_cast(idx)); return str; } bool ScanCMDBool(char * cmd,char const * const check) { char * scan=cmd;size_t c_len=strlen(check); while ((scan=strchr(scan,'/'))) { /* found a / now see behind it */ scan++; if (strncasecmp(scan,check,c_len)==0 && (scan[c_len]==' ' || scan[c_len]=='\t' || scan[c_len]=='/' || scan[c_len]==0)) { /* Found a math now remove it from the string */ memmove(scan-1,scan+c_len,strlen(scan+c_len)+1); trim(scan-1); return true; } } return false; } /* This scans the command line for a remaining switch and reports it else returns 0*/ char * ScanCMDRemain(char * cmd) { char * scan,*found;; if ((scan=found=strchr(cmd,'/'))) { while ( *scan && !isspace(*reinterpret_cast(scan)) ) scan++; *scan=0; return found; } else return 0; } char * StripWord(char *&line) { char * scan=line; scan=ltrim(scan); if (*scan=='"') { char * end_quote=strchr(scan+1,'"'); if (end_quote) { *end_quote=0; line=ltrim(++end_quote); return (scan+1); } } char * begin=scan; for (char c = *scan ;(c = *scan);scan++) { if (isspace(*reinterpret_cast(&c))) { *scan++=0; break; } } line=scan; return begin; } Bits ConvDecWord(char * word) { bool negative=false;Bitu ret=0; if (*word=='-') { negative=true; word++; } while (char c=*word) { ret*=10; ret+=c-'0'; word++; } if (negative) return 0-ret; else return ret; } Bits ConvHexWord(char * word) { Bitu ret=0; while (char c=toupper(*reinterpret_cast(word))) { ret*=16; if (c>='0' && c<='9') ret+=c-'0'; else if (c>='A' && c<='F') ret+=10+(c-'A'); word++; } return ret; } double ConvDblWord(char * word) { return 0.0f; } static char buf[1024]; //greater scope as else it doesn't always gets thrown right (linux/gcc2.95) void E_Exit(const char * format,...) { #if C_DEBUG && C_HEAVY_DEBUG DEBUG_HeavyWriteLogInstruction(); #endif va_list msg; va_start(msg,format); vsprintf(buf,format,msg); va_end(msg); strcat(buf,"\n"); throw(buf); }