misc.cpp

Wed, 10 Apr 2013 01:51:35 +0300

author
Santeri Piippo <crimsondusk64@gmail.com>
date
Wed, 10 Apr 2013 01:51:35 +0300
changeset 87
8dbf0fdf3374
parent 78
c190fe218506
child 104
6e29bb0e83c5
permissions
-rw-r--r--

Split some stuff out of the edit tool bar into move and object tool bars. The object tool bar is now located on the left side of the screen as the top one is running out of space.

/*
 *  LDForge: LDraw parts authoring CAD
 *  Copyright (C) 2013 Santeri `arezey` Piippo
 *  
 *  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 3 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, see <http://www.gnu.org/licenses/>.
 */

#include <math.h>
#include <locale.h>
#include "common.h"
#include "misc.h"

// =============================================================================
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// =============================================================================
void stripWhitespace (str& s) {
	str other;
	
	for (size_t i = 0; i < ~s; i++)
		if (s[i] > 32 && s[i] < 127)
			other += s[i];
}

// =============================================================================
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// =============================================================================
str ftoa (double fCoord) {
	// Disable the locale first so that the decimal point will not
	// turn into anything weird (like commas)
	setlocale (LC_NUMERIC, "C");
	
	str zRep = str::mkfmt ("%f", fCoord);
	
	// Remove trailing zeroes
	while (zRep[~zRep - 1] == '0')
		zRep -= 1;
	
	// If there was only zeroes in the decimal place, remove
	// the decimal point now.
	if (zRep[~zRep - 1] == '.')
		zRep -= 1;
	
	return zRep;
}

// =============================================================================
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// =============================================================================
bool isNumber (str& zToken) {
	char* cpPointer = &zToken[0];
	bool bGotDot = false;
	
	// Allow leading hyphen for negatives
	if (*cpPointer == '-')
		cpPointer++;
	
	while (*cpPointer != '\0') {
		if (*cpPointer == '.' && !bGotDot) {
			// Decimal point
			bGotDot = true;
			cpPointer++;
			continue;
		}
		
		if (*cpPointer >= '0' && *cpPointer <= '9') {
			cpPointer++;
			continue; // Digit
		}
		
		// If the above cases didn't catch this character, it was
		// illegal and this is therefore not a number.
		return false;
	}
	
	return true;
}

// =============================================================================
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// =============================================================================
stringparser::stringparser (str zInText, char cSeparator) {
	zaTokens = zInText.split (cSeparator, true);
	dPos = -1;
}

// -----------------------------------------------------------------------------
bool stringparser::atBeginning () {
	return (dPos == -1);
}

// -----------------------------------------------------------------------------
bool stringparser::atEnd () {
	return (dPos == (signed)zaTokens.size() - 1);
}

// -----------------------------------------------------------------------------
bool stringparser::getToken (str& zVal, const ushort uInPos) {
	if (uInPos >= zaTokens.size())
		return false;
	
	zVal = zaTokens[uInPos];
	return true;
}

// -----------------------------------------------------------------------------
bool stringparser::next (str& zVal) {
	return getToken (zVal, ++dPos);
}

// -----------------------------------------------------------------------------
bool stringparser::peekNext (str& zVal) {
	return getToken (zVal, dPos + 1);
}

// -----------------------------------------------------------------------------
bool stringparser::findToken (short& dResult, char const* sNeedle, short dArgs) {
	for (ushort i = 0; i < (zaTokens.size() - dArgs); ++i) {
		if (zaTokens[i] == sNeedle) {
			dResult = i;
			return true;
		}
	}
	
	return false;
}

// -----------------------------------------------------------------------------
void stringparser::rewind () {
	dPos = -1;
}

// -----------------------------------------------------------------------------
void stringparser::seek (short int dAmount, bool bRelative) {
	dPos = (bRelative ? dPos : 0) + dAmount;
}

// -----------------------------------------------------------------------------
size_t stringparser::size () {
	return zaTokens.size();
}

// -----------------------------------------------------------------------------
bool stringparser::tokenCompare (short int dInPos, const char* sOther) {
	str tok;
	if (!getToken (tok, dInPos))
		return false;
	
	return (tok == sOther);
}

mercurial