2006-05-05 20:52:09 +02:00
|
|
|
// Copyright (c) 2005-2006, Rodrigo Braz Monteiro
|
2006-01-16 22:02:54 +01:00
|
|
|
// All rights reserved.
|
|
|
|
//
|
|
|
|
// Redistribution and use in source and binary forms, with or without
|
|
|
|
// modification, are permitted provided that the following conditions are met:
|
|
|
|
//
|
|
|
|
// * Redistributions of source code must retain the above copyright notice,
|
|
|
|
// this list of conditions and the following disclaimer.
|
|
|
|
// * Redistributions in binary form must reproduce the above copyright notice,
|
|
|
|
// this list of conditions and the following disclaimer in the documentation
|
|
|
|
// and/or other materials provided with the distribution.
|
|
|
|
// * Neither the name of the Aegisub Group nor the names of its contributors
|
|
|
|
// may be used to endorse or promote products derived from this software
|
|
|
|
// without specific prior written permission.
|
|
|
|
//
|
|
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
|
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
|
|
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
// POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
//
|
2009-07-29 07:43:02 +02:00
|
|
|
// Aegisub Project http://www.aegisub.org/
|
2006-01-16 22:02:54 +01:00
|
|
|
//
|
2009-07-29 07:43:02 +02:00
|
|
|
// $Id$
|
|
|
|
|
|
|
|
/// @file utils.cpp
|
|
|
|
/// @brief Misc. utility functions
|
|
|
|
/// @ingroup utility
|
|
|
|
///
|
2006-01-16 22:02:54 +01:00
|
|
|
|
|
|
|
|
|
|
|
///////////
|
|
|
|
// Headers
|
2009-01-04 07:31:48 +01:00
|
|
|
#include "config.h"
|
|
|
|
|
2009-09-10 15:06:40 +02:00
|
|
|
#ifndef AGI_PRE
|
2012-01-12 23:32:20 +01:00
|
|
|
#include <set>
|
|
|
|
|
2009-09-10 15:06:40 +02:00
|
|
|
#ifdef __UNIX__
|
|
|
|
#include <unistd.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <wx/dcmemory.h>
|
2006-01-16 22:02:54 +01:00
|
|
|
#include <wx/filename.h>
|
2010-02-15 04:06:04 +01:00
|
|
|
#include <wx/log.h>
|
2009-01-04 12:45:06 +01:00
|
|
|
#include <wx/stdpaths.h>
|
2011-10-28 22:15:10 +02:00
|
|
|
#include <wx/window.h>
|
2006-01-16 22:02:54 +01:00
|
|
|
#endif
|
2009-09-10 15:06:40 +02:00
|
|
|
|
2010-08-12 16:36:09 +02:00
|
|
|
#include <libaegisub/log.h>
|
|
|
|
|
2009-01-04 12:45:06 +01:00
|
|
|
#ifdef __APPLE__
|
2010-08-14 19:42:37 +02:00
|
|
|
#include <libaegisub/util_osx.h>
|
2009-01-04 12:45:06 +01:00
|
|
|
#endif
|
2006-01-16 22:02:54 +01:00
|
|
|
|
2009-09-10 15:06:40 +02:00
|
|
|
#include "utils.h"
|
|
|
|
|
2006-01-16 22:02:54 +01:00
|
|
|
|
2006-04-13 09:41:20 +02:00
|
|
|
#ifndef __LINUX__
|
Note: This was done using a script! it's far from perfect but 95% of the work has been done already formatting-wise.
Document all functions, class, struct, union, enum, macro, variable, typedefs. This isn't the actual document in itself but empty documentation using any old documentation if it was there.
This was done using exuberant ctags to get tag info, then a TCL script to parse/remove old comments and convert them into Doxygen-style.
Some notes:
* Anything labeled 'DOCME' needs to be documented, @param and @return have been left blank as it would be annoying to delete the 'DOCME' from every one of those.
* Some multiline comments may have been munged into single line comments
* Leave the /// comments above global variables with a space, if they're harder to read then we'll be less likey to use them.
* Enum comments can go after the enumeration itself '[value] /// comment'
* include/aegisub/*.h haven't been converted yet, this will be done in a later commit
* Some documentation blocks are in the wrong place, in the .h when it should be in the .cpp, or vice versa.
See http://devel.aegisub.org/wiki/Doxygen for some details on Doxygen and a 'style guide'.
Originally committed to SVN as r3312.
2009-07-30 00:59:22 +02:00
|
|
|
|
|
|
|
/// @brief Absolute of 64 bit int
|
|
|
|
/// @param input
|
|
|
|
/// @return
|
|
|
|
///
|
2007-08-31 16:11:35 +02:00
|
|
|
int64_t abs64(int64_t input) {
|
2006-01-16 22:02:54 +01:00
|
|
|
if (input < 0) return -input;
|
|
|
|
return input;
|
|
|
|
}
|
2006-02-26 03:53:45 +01:00
|
|
|
#endif
|
2006-01-16 22:02:54 +01:00
|
|
|
|
|
|
|
|
Note: This was done using a script! it's far from perfect but 95% of the work has been done already formatting-wise.
Document all functions, class, struct, union, enum, macro, variable, typedefs. This isn't the actual document in itself but empty documentation using any old documentation if it was there.
This was done using exuberant ctags to get tag info, then a TCL script to parse/remove old comments and convert them into Doxygen-style.
Some notes:
* Anything labeled 'DOCME' needs to be documented, @param and @return have been left blank as it would be annoying to delete the 'DOCME' from every one of those.
* Some multiline comments may have been munged into single line comments
* Leave the /// comments above global variables with a space, if they're harder to read then we'll be less likey to use them.
* Enum comments can go after the enumeration itself '[value] /// comment'
* include/aegisub/*.h haven't been converted yet, this will be done in a later commit
* Some documentation blocks are in the wrong place, in the .h when it should be in the .cpp, or vice versa.
See http://devel.aegisub.org/wiki/Doxygen for some details on Doxygen and a 'style guide'.
Originally committed to SVN as r3312.
2009-07-30 00:59:22 +02:00
|
|
|
|
|
|
|
/// @brief Count number of matches of a substr
|
|
|
|
/// @param parent
|
|
|
|
/// @param child
|
|
|
|
/// @return
|
|
|
|
///
|
2006-01-16 22:02:54 +01:00
|
|
|
int CountMatches(wxString parent,wxString child) {
|
2007-01-24 04:54:32 +01:00
|
|
|
size_t pos = wxString::npos;
|
2006-01-16 22:02:54 +01:00
|
|
|
int n = 0;
|
|
|
|
while ((pos = parent.find(child,pos+1)) != wxString::npos) n++;
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
Note: This was done using a script! it's far from perfect but 95% of the work has been done already formatting-wise.
Document all functions, class, struct, union, enum, macro, variable, typedefs. This isn't the actual document in itself but empty documentation using any old documentation if it was there.
This was done using exuberant ctags to get tag info, then a TCL script to parse/remove old comments and convert them into Doxygen-style.
Some notes:
* Anything labeled 'DOCME' needs to be documented, @param and @return have been left blank as it would be annoying to delete the 'DOCME' from every one of those.
* Some multiline comments may have been munged into single line comments
* Leave the /// comments above global variables with a space, if they're harder to read then we'll be less likey to use them.
* Enum comments can go after the enumeration itself '[value] /// comment'
* include/aegisub/*.h haven't been converted yet, this will be done in a later commit
* Some documentation blocks are in the wrong place, in the .h when it should be in the .cpp, or vice versa.
See http://devel.aegisub.org/wiki/Doxygen for some details on Doxygen and a 'style guide'.
Originally committed to SVN as r3312.
2009-07-30 00:59:22 +02:00
|
|
|
|
|
|
|
/// @brief Make a path relative to reference
|
|
|
|
/// @param _path
|
|
|
|
/// @param reference
|
|
|
|
/// @return
|
|
|
|
///
|
2006-01-16 22:02:54 +01:00
|
|
|
wxString MakeRelativePath(wxString _path,wxString reference) {
|
2011-09-28 21:43:11 +02:00
|
|
|
if (_path.IsEmpty()) return "";
|
|
|
|
if (_path.Left(1) == "?") return _path;
|
2006-01-16 22:02:54 +01:00
|
|
|
wxFileName path(_path);
|
|
|
|
wxFileName refPath(reference);
|
|
|
|
path.MakeRelativeTo(refPath.GetPath());
|
|
|
|
return path.GetFullPath();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
Note: This was done using a script! it's far from perfect but 95% of the work has been done already formatting-wise.
Document all functions, class, struct, union, enum, macro, variable, typedefs. This isn't the actual document in itself but empty documentation using any old documentation if it was there.
This was done using exuberant ctags to get tag info, then a TCL script to parse/remove old comments and convert them into Doxygen-style.
Some notes:
* Anything labeled 'DOCME' needs to be documented, @param and @return have been left blank as it would be annoying to delete the 'DOCME' from every one of those.
* Some multiline comments may have been munged into single line comments
* Leave the /// comments above global variables with a space, if they're harder to read then we'll be less likey to use them.
* Enum comments can go after the enumeration itself '[value] /// comment'
* include/aegisub/*.h haven't been converted yet, this will be done in a later commit
* Some documentation blocks are in the wrong place, in the .h when it should be in the .cpp, or vice versa.
See http://devel.aegisub.org/wiki/Doxygen for some details on Doxygen and a 'style guide'.
Originally committed to SVN as r3312.
2009-07-30 00:59:22 +02:00
|
|
|
|
|
|
|
/// @brief Extract original path from relative
|
|
|
|
/// @param _path
|
|
|
|
/// @param reference
|
|
|
|
/// @return
|
|
|
|
///
|
2006-01-16 22:02:54 +01:00
|
|
|
wxString DecodeRelativePath(wxString _path,wxString reference) {
|
2011-09-28 21:43:11 +02:00
|
|
|
if (_path.IsEmpty()) return "";
|
|
|
|
if (_path.Left(1) == "?") return _path;
|
2006-01-16 22:02:54 +01:00
|
|
|
wxFileName path(_path);
|
|
|
|
wxFileName refPath(reference);
|
|
|
|
if (!path.IsAbsolute()) path.MakeAbsolute(refPath.GetPath());
|
2007-01-01 05:15:54 +01:00
|
|
|
#ifdef __UNIX__
|
2006-12-28 23:31:33 +01:00
|
|
|
return path.GetFullPath(wxPATH_UNIX); // also works on windows
|
2007-01-01 05:15:54 +01:00
|
|
|
// No, it doesn't, this ommits drive letter in Windows. ~ amz
|
|
|
|
#else
|
|
|
|
return path.GetFullPath();
|
|
|
|
#endif
|
2006-01-16 22:02:54 +01:00
|
|
|
}
|
|
|
|
|
Note: This was done using a script! it's far from perfect but 95% of the work has been done already formatting-wise.
Document all functions, class, struct, union, enum, macro, variable, typedefs. This isn't the actual document in itself but empty documentation using any old documentation if it was there.
This was done using exuberant ctags to get tag info, then a TCL script to parse/remove old comments and convert them into Doxygen-style.
Some notes:
* Anything labeled 'DOCME' needs to be documented, @param and @return have been left blank as it would be annoying to delete the 'DOCME' from every one of those.
* Some multiline comments may have been munged into single line comments
* Leave the /// comments above global variables with a space, if they're harder to read then we'll be less likey to use them.
* Enum comments can go after the enumeration itself '[value] /// comment'
* include/aegisub/*.h haven't been converted yet, this will be done in a later commit
* Some documentation blocks are in the wrong place, in the .h when it should be in the .cpp, or vice versa.
See http://devel.aegisub.org/wiki/Doxygen for some details on Doxygen and a 'style guide'.
Originally committed to SVN as r3312.
2009-07-30 00:59:22 +02:00
|
|
|
/// @brief Float to string
|
|
|
|
/// @param value
|
|
|
|
/// @return
|
|
|
|
///
|
2009-04-06 22:01:42 +02:00
|
|
|
wxString AegiFloatToString(double value) {
|
2011-09-28 21:43:11 +02:00
|
|
|
return wxString::Format("%g",value);
|
2006-04-04 22:41:09 +02:00
|
|
|
}
|
|
|
|
|
Note: This was done using a script! it's far from perfect but 95% of the work has been done already formatting-wise.
Document all functions, class, struct, union, enum, macro, variable, typedefs. This isn't the actual document in itself but empty documentation using any old documentation if it was there.
This was done using exuberant ctags to get tag info, then a TCL script to parse/remove old comments and convert them into Doxygen-style.
Some notes:
* Anything labeled 'DOCME' needs to be documented, @param and @return have been left blank as it would be annoying to delete the 'DOCME' from every one of those.
* Some multiline comments may have been munged into single line comments
* Leave the /// comments above global variables with a space, if they're harder to read then we'll be less likey to use them.
* Enum comments can go after the enumeration itself '[value] /// comment'
* include/aegisub/*.h haven't been converted yet, this will be done in a later commit
* Some documentation blocks are in the wrong place, in the .h when it should be in the .cpp, or vice versa.
See http://devel.aegisub.org/wiki/Doxygen for some details on Doxygen and a 'style guide'.
Originally committed to SVN as r3312.
2009-07-30 00:59:22 +02:00
|
|
|
/// @brief Int to string
|
|
|
|
/// @param value
|
|
|
|
/// @return
|
|
|
|
///
|
2009-04-06 22:01:42 +02:00
|
|
|
wxString AegiIntegerToString(int value) {
|
2011-09-28 21:43:11 +02:00
|
|
|
return wxString::Format("%i",value);
|
2006-04-04 22:41:09 +02:00
|
|
|
}
|
2006-07-01 04:27:37 +02:00
|
|
|
|
Note: This was done using a script! it's far from perfect but 95% of the work has been done already formatting-wise.
Document all functions, class, struct, union, enum, macro, variable, typedefs. This isn't the actual document in itself but empty documentation using any old documentation if it was there.
This was done using exuberant ctags to get tag info, then a TCL script to parse/remove old comments and convert them into Doxygen-style.
Some notes:
* Anything labeled 'DOCME' needs to be documented, @param and @return have been left blank as it would be annoying to delete the 'DOCME' from every one of those.
* Some multiline comments may have been munged into single line comments
* Leave the /// comments above global variables with a space, if they're harder to read then we'll be less likey to use them.
* Enum comments can go after the enumeration itself '[value] /// comment'
* include/aegisub/*.h haven't been converted yet, this will be done in a later commit
* Some documentation blocks are in the wrong place, in the .h when it should be in the .cpp, or vice versa.
See http://devel.aegisub.org/wiki/Doxygen for some details on Doxygen and a 'style guide'.
Originally committed to SVN as r3312.
2009-07-30 00:59:22 +02:00
|
|
|
/// @brief There shall be no kiB, MiB stuff here Pretty reading of size
|
|
|
|
/// @param bytes
|
|
|
|
/// @return
|
|
|
|
///
|
2006-07-01 04:27:37 +02:00
|
|
|
wxString PrettySize(int bytes) {
|
|
|
|
// Suffixes
|
|
|
|
wxArrayString suffix;
|
2011-09-28 21:43:11 +02:00
|
|
|
suffix.Add("");
|
|
|
|
suffix.Add(" kB");
|
|
|
|
suffix.Add(" MB");
|
|
|
|
suffix.Add(" GB");
|
|
|
|
suffix.Add(" TB");
|
|
|
|
suffix.Add(" PB");
|
2006-07-01 04:27:37 +02:00
|
|
|
|
|
|
|
// Set size
|
|
|
|
int i = 0;
|
|
|
|
double size = bytes;
|
|
|
|
while (size > 1024) {
|
|
|
|
size = size / 1024.0;
|
|
|
|
i++;
|
|
|
|
if (i == 6) {
|
|
|
|
i--;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set number of decimal places
|
|
|
|
wxString final;
|
2011-09-28 21:43:11 +02:00
|
|
|
if (size < 10) final = wxString::Format("%.2f",size);
|
|
|
|
else if (size < 100) final = wxString::Format("%.1f",size);
|
|
|
|
else final = wxString::Format("%.0f",size);
|
2006-07-01 04:27:37 +02:00
|
|
|
return final + suffix[i];
|
|
|
|
}
|
2007-01-11 06:33:36 +01:00
|
|
|
|
|
|
|
|
Note: This was done using a script! it's far from perfect but 95% of the work has been done already formatting-wise.
Document all functions, class, struct, union, enum, macro, variable, typedefs. This isn't the actual document in itself but empty documentation using any old documentation if it was there.
This was done using exuberant ctags to get tag info, then a TCL script to parse/remove old comments and convert them into Doxygen-style.
Some notes:
* Anything labeled 'DOCME' needs to be documented, @param and @return have been left blank as it would be annoying to delete the 'DOCME' from every one of those.
* Some multiline comments may have been munged into single line comments
* Leave the /// comments above global variables with a space, if they're harder to read then we'll be less likey to use them.
* Enum comments can go after the enumeration itself '[value] /// comment'
* include/aegisub/*.h haven't been converted yet, this will be done in a later commit
* Some documentation blocks are in the wrong place, in the .h when it should be in the .cpp, or vice versa.
See http://devel.aegisub.org/wiki/Doxygen for some details on Doxygen and a 'style guide'.
Originally committed to SVN as r3312.
2009-07-30 00:59:22 +02:00
|
|
|
|
|
|
|
/// @brief Code from http://bob.allegronetwork.com/prog/tricks.html Get the smallest power of two that is greater or equal to x
|
|
|
|
/// @param x
|
|
|
|
/// @return
|
|
|
|
///
|
2007-01-21 07:30:19 +01:00
|
|
|
int SmallestPowerOf2(int x) {
|
|
|
|
x--;
|
|
|
|
x |= (x >> 1);
|
|
|
|
x |= (x >> 2);
|
|
|
|
x |= (x >> 4);
|
|
|
|
x |= (x >> 8);
|
|
|
|
x |= (x >> 16);
|
|
|
|
x++;
|
|
|
|
return x;
|
|
|
|
}
|
2007-04-14 17:26:46 +02:00
|
|
|
|
2012-01-11 20:19:03 +01:00
|
|
|
void GetWordBoundaries(const wxString text, IntPairVector &results, int start, int end) {
|
2007-04-14 17:26:46 +02:00
|
|
|
int depth = 0;
|
2012-01-11 20:19:03 +01:00
|
|
|
bool in_draw_mode = false;
|
|
|
|
if (end < 0) end = text.size();
|
2007-04-14 17:26:46 +02:00
|
|
|
|
|
|
|
// Delimiters
|
2012-01-11 20:19:03 +01:00
|
|
|
static std::set<wxUniChar> delims;
|
|
|
|
if (delims.empty()) {
|
|
|
|
const wxUniChar delim_chars[] = {
|
|
|
|
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0028,
|
|
|
|
0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x003a,
|
|
|
|
0x003b, 0x003d, 0x003f, 0x0040, 0x005b, 0x005c, 0x005d, 0x005e,
|
|
|
|
0x005f, 0x0060, 0x007b, 0x007c, 0x007d, 0x007e, 0x00a1, 0x00a2,
|
|
|
|
0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00aa, 0x00ab,
|
|
|
|
0x00b0, 0x00b6, 0x00b7, 0x00ba, 0x00bb, 0x00bf, 0x02dc, 0x0e3f,
|
|
|
|
0x2010, 0x2013, 0x2014, 0x2015, 0x2018, 0x2019, 0x201c, 0x201d,
|
|
|
|
0x2020, 0x2021, 0x2022, 0x2025, 0x2026, 0x2026, 0x2030, 0x2031,
|
|
|
|
0x2032, 0x203b, 0x203b, 0x203d, 0x2042, 0x2044, 0x20a6, 0x20a9,
|
|
|
|
0x20aa, 0x20ac, 0x20ad, 0x2116, 0x2234, 0x2235, 0x2420, 0x2422,
|
|
|
|
0x2423, 0x2506, 0x25ca, 0x2605, 0x261e, 0x2e2e, 0x3000, 0x3001,
|
|
|
|
0x3002, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e,
|
|
|
|
0x300f, 0x3010, 0x3011, 0x3014, 0x3015, 0x3016, 0x3017, 0x3018,
|
|
|
|
0x3019, 0x301a, 0x301b, 0x301c, 0x3030, 0x303d, 0x30fb, 0xff0a,
|
|
|
|
0xff5b, 0xff5d, 0xff5e
|
|
|
|
};
|
|
|
|
delims.insert(delim_chars, delim_chars + sizeof(delim_chars) / sizeof(delim_chars[0]));
|
|
|
|
}
|
2007-04-14 17:26:46 +02:00
|
|
|
|
2012-01-11 20:19:03 +01:00
|
|
|
for (int i = start; i < end + 1; ++i) {
|
2007-04-14 17:26:46 +02:00
|
|
|
// Current character
|
2012-01-12 22:33:14 +01:00
|
|
|
wxUniChar cur = i < end ? text[i] : wxUniChar('.');
|
2007-04-14 17:26:46 +02:00
|
|
|
|
|
|
|
// Increase depth
|
|
|
|
if (cur == '{') {
|
|
|
|
depth++;
|
2012-01-11 20:19:03 +01:00
|
|
|
if (depth == 1 && start != i && !in_draw_mode)
|
|
|
|
results.push_back(std::make_pair(start, i));
|
2007-04-14 17:26:46 +02:00
|
|
|
}
|
|
|
|
// Decrease depth
|
2012-01-11 20:19:03 +01:00
|
|
|
else if (cur == '}') {
|
2007-04-14 17:26:46 +02:00
|
|
|
depth--;
|
2012-01-11 20:19:03 +01:00
|
|
|
start = i + 1;
|
2007-04-14 17:26:46 +02:00
|
|
|
}
|
2012-01-11 20:19:03 +01:00
|
|
|
else if (depth > 0) {
|
|
|
|
// Check for draw mode
|
|
|
|
if (cur == '\\' && i + 1 < end && text[i + 1] == 'p') {
|
|
|
|
i += 2;
|
2007-04-14 17:26:46 +02:00
|
|
|
|
2012-01-11 20:19:03 +01:00
|
|
|
// Eat leading zeros
|
|
|
|
while (i < end && text[i] == '0') ++i;
|
2007-04-14 17:26:46 +02:00
|
|
|
|
2012-01-11 20:19:03 +01:00
|
|
|
in_draw_mode = i < end && text[i] >= '0' && text[i] <= '9';
|
|
|
|
if (!in_draw_mode) --i;
|
|
|
|
}
|
2007-04-14 17:26:46 +02:00
|
|
|
}
|
2012-01-11 20:19:03 +01:00
|
|
|
else if (!in_draw_mode) {
|
|
|
|
// Check if it is \n or \N
|
|
|
|
if (cur == '\\' && i < end-1 && (text[i+1] == 'N' || text[i+1] == 'n' || text[i+1] == 'h')) {
|
|
|
|
if (start != i)
|
|
|
|
results.push_back(std::make_pair(start, i));
|
|
|
|
start = i + 2;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
// Check for standard delimiters
|
|
|
|
else if (delims.count(cur)) {
|
|
|
|
if (start != i)
|
|
|
|
results.push_back(std::make_pair(start, i));
|
|
|
|
start = i + 1;
|
2007-04-14 17:26:46 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2009-06-25 00:22:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
Note: This was done using a script! it's far from perfect but 95% of the work has been done already formatting-wise.
Document all functions, class, struct, union, enum, macro, variable, typedefs. This isn't the actual document in itself but empty documentation using any old documentation if it was there.
This was done using exuberant ctags to get tag info, then a TCL script to parse/remove old comments and convert them into Doxygen-style.
Some notes:
* Anything labeled 'DOCME' needs to be documented, @param and @return have been left blank as it would be annoying to delete the 'DOCME' from every one of those.
* Some multiline comments may have been munged into single line comments
* Leave the /// comments above global variables with a space, if they're harder to read then we'll be less likey to use them.
* Enum comments can go after the enumeration itself '[value] /// comment'
* include/aegisub/*.h haven't been converted yet, this will be done in a later commit
* Some documentation blocks are in the wrong place, in the .h when it should be in the .cpp, or vice versa.
See http://devel.aegisub.org/wiki/Doxygen for some details on Doxygen and a 'style guide'.
Originally committed to SVN as r3312.
2009-07-30 00:59:22 +02:00
|
|
|
|
|
|
|
/// @brief Determine whether wchar 'c' is a whitespace character
|
|
|
|
/// @param c
|
|
|
|
/// @return
|
|
|
|
///
|
2009-06-25 00:22:45 +02:00
|
|
|
bool IsWhitespace(wchar_t c)
|
|
|
|
{
|
|
|
|
const wchar_t whitespaces[] = {
|
|
|
|
// http://en.wikipedia.org/wiki/Space_(punctuation)#Table_of_spaces
|
|
|
|
0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x0020, 0x0085, 0x00A0,
|
|
|
|
0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005,
|
|
|
|
0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x2028, 0x2029, 0x202F,
|
|
|
|
0x025F, 0x3000, 0xFEFF
|
|
|
|
};
|
|
|
|
const size_t num_chars = sizeof(whitespaces) / sizeof(whitespaces[0]);
|
|
|
|
|
|
|
|
for (size_t i = 0; i < num_chars; ++i)
|
|
|
|
if (whitespaces[i] == c)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
Note: This was done using a script! it's far from perfect but 95% of the work has been done already formatting-wise.
Document all functions, class, struct, union, enum, macro, variable, typedefs. This isn't the actual document in itself but empty documentation using any old documentation if it was there.
This was done using exuberant ctags to get tag info, then a TCL script to parse/remove old comments and convert them into Doxygen-style.
Some notes:
* Anything labeled 'DOCME' needs to be documented, @param and @return have been left blank as it would be annoying to delete the 'DOCME' from every one of those.
* Some multiline comments may have been munged into single line comments
* Leave the /// comments above global variables with a space, if they're harder to read then we'll be less likey to use them.
* Enum comments can go after the enumeration itself '[value] /// comment'
* include/aegisub/*.h haven't been converted yet, this will be done in a later commit
* Some documentation blocks are in the wrong place, in the .h when it should be in the .cpp, or vice versa.
See http://devel.aegisub.org/wiki/Doxygen for some details on Doxygen and a 'style guide'.
Originally committed to SVN as r3312.
2009-07-30 00:59:22 +02:00
|
|
|
|
|
|
|
/// @brief Returns true if str is empty of consists of only whitespace
|
|
|
|
/// @param str
|
|
|
|
/// @return
|
|
|
|
///
|
2009-06-25 00:22:45 +02:00
|
|
|
bool StringEmptyOrWhitespace(const wxString &str)
|
|
|
|
{
|
|
|
|
for (size_t i = 0; i < str.size(); ++i)
|
|
|
|
if (!IsWhitespace(str[i]))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
return true;
|
2007-04-14 17:26:46 +02:00
|
|
|
}
|
2007-04-21 00:17:42 +02:00
|
|
|
|
|
|
|
|
Note: This was done using a script! it's far from perfect but 95% of the work has been done already formatting-wise.
Document all functions, class, struct, union, enum, macro, variable, typedefs. This isn't the actual document in itself but empty documentation using any old documentation if it was there.
This was done using exuberant ctags to get tag info, then a TCL script to parse/remove old comments and convert them into Doxygen-style.
Some notes:
* Anything labeled 'DOCME' needs to be documented, @param and @return have been left blank as it would be annoying to delete the 'DOCME' from every one of those.
* Some multiline comments may have been munged into single line comments
* Leave the /// comments above global variables with a space, if they're harder to read then we'll be less likey to use them.
* Enum comments can go after the enumeration itself '[value] /// comment'
* include/aegisub/*.h haven't been converted yet, this will be done in a later commit
* Some documentation blocks are in the wrong place, in the .h when it should be in the .cpp, or vice versa.
See http://devel.aegisub.org/wiki/Doxygen for some details on Doxygen and a 'style guide'.
Originally committed to SVN as r3312.
2009-07-30 00:59:22 +02:00
|
|
|
|
|
|
|
/// @brief wxString::ToLong() is slow and not as flexible String to integer
|
|
|
|
/// @param str
|
|
|
|
/// @param start
|
|
|
|
/// @param end
|
|
|
|
/// @return
|
|
|
|
///
|
2009-04-06 22:01:42 +02:00
|
|
|
int AegiStringToInt(const wxString &str,int start,int end) {
|
2007-04-21 00:17:42 +02:00
|
|
|
// Initialize to zero and get length if end set to -1
|
|
|
|
int sign = 1;
|
|
|
|
int value = 0;
|
|
|
|
if (end == -1) end = str.Length();
|
|
|
|
|
2008-03-13 19:55:09 +01:00
|
|
|
for (int pos=start;pos<end;pos++) {
|
2007-04-21 00:17:42 +02:00
|
|
|
// Get value and check if it's a number
|
|
|
|
int val = (int)(str[pos]);
|
2011-09-28 21:43:11 +02:00
|
|
|
if (val == ' ' || val == '\t') continue;
|
|
|
|
if (val == '-') sign = -1;
|
|
|
|
if (val < '0' || val > '9') break;
|
2007-04-21 00:17:42 +02:00
|
|
|
|
|
|
|
// Shift value to next decimal place and increment the value just read
|
2011-09-28 21:43:11 +02:00
|
|
|
value = value * 10 + (val - '0');
|
2007-04-21 00:17:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return value*sign;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
Note: This was done using a script! it's far from perfect but 95% of the work has been done already formatting-wise.
Document all functions, class, struct, union, enum, macro, variable, typedefs. This isn't the actual document in itself but empty documentation using any old documentation if it was there.
This was done using exuberant ctags to get tag info, then a TCL script to parse/remove old comments and convert them into Doxygen-style.
Some notes:
* Anything labeled 'DOCME' needs to be documented, @param and @return have been left blank as it would be annoying to delete the 'DOCME' from every one of those.
* Some multiline comments may have been munged into single line comments
* Leave the /// comments above global variables with a space, if they're harder to read then we'll be less likey to use them.
* Enum comments can go after the enumeration itself '[value] /// comment'
* include/aegisub/*.h haven't been converted yet, this will be done in a later commit
* Some documentation blocks are in the wrong place, in the .h when it should be in the .cpp, or vice versa.
See http://devel.aegisub.org/wiki/Doxygen for some details on Doxygen and a 'style guide'.
Originally committed to SVN as r3312.
2009-07-30 00:59:22 +02:00
|
|
|
|
|
|
|
/// @brief String to fixed point
|
|
|
|
/// @param str
|
|
|
|
/// @param decimalPlaces
|
|
|
|
/// @param start
|
|
|
|
/// @param end
|
|
|
|
/// @return
|
|
|
|
///
|
2009-04-06 22:01:42 +02:00
|
|
|
int AegiStringToFix(const wxString &str,size_t decimalPlaces,int start,int end) {
|
2007-04-21 00:17:42 +02:00
|
|
|
// Parts of the number
|
|
|
|
int sign = 1;
|
|
|
|
int major = 0;
|
|
|
|
int minor = 0;
|
|
|
|
if (end == -1) end = str.Length();
|
|
|
|
bool inMinor = false;
|
|
|
|
int *dst = &major;
|
|
|
|
size_t mCount = 0;
|
|
|
|
|
2008-03-13 19:55:09 +01:00
|
|
|
for (int pos=start;pos<end;pos++) {
|
2007-04-21 00:17:42 +02:00
|
|
|
// Get value and check if it's a number
|
|
|
|
int val = (int)(str[pos]);
|
2011-09-28 21:43:11 +02:00
|
|
|
if (val == ' ' || val == '\t') continue;
|
|
|
|
if (val == '-') sign = -1;
|
2007-04-21 00:17:42 +02:00
|
|
|
|
|
|
|
// Switch to minor
|
2011-09-28 21:43:11 +02:00
|
|
|
if (val == '.' || val == ',') {
|
2007-04-21 00:17:42 +02:00
|
|
|
if (inMinor) break;
|
|
|
|
inMinor = true;
|
|
|
|
dst = &minor;
|
|
|
|
mCount = 0;
|
|
|
|
continue;
|
|
|
|
}
|
2011-09-28 21:43:11 +02:00
|
|
|
if (val < '0' || val > '9') break;
|
|
|
|
*dst = (*dst * 10) + (val - '0');
|
2007-04-21 00:17:42 +02:00
|
|
|
mCount++;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Change minor to have the right number of decimal places
|
|
|
|
while (mCount > decimalPlaces) {
|
|
|
|
minor /= 10;
|
|
|
|
mCount--;
|
|
|
|
}
|
|
|
|
while (mCount < decimalPlaces) {
|
|
|
|
minor *= 10;
|
|
|
|
mCount++;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Shift major and return
|
|
|
|
for (size_t i=0;i<decimalPlaces;i++) major *= 10;
|
|
|
|
return (major + minor)*sign;
|
|
|
|
}
|
2007-07-05 01:09:40 +02:00
|
|
|
|
|
|
|
|
Note: This was done using a script! it's far from perfect but 95% of the work has been done already formatting-wise.
Document all functions, class, struct, union, enum, macro, variable, typedefs. This isn't the actual document in itself but empty documentation using any old documentation if it was there.
This was done using exuberant ctags to get tag info, then a TCL script to parse/remove old comments and convert them into Doxygen-style.
Some notes:
* Anything labeled 'DOCME' needs to be documented, @param and @return have been left blank as it would be annoying to delete the 'DOCME' from every one of those.
* Some multiline comments may have been munged into single line comments
* Leave the /// comments above global variables with a space, if they're harder to read then we'll be less likey to use them.
* Enum comments can go after the enumeration itself '[value] /// comment'
* include/aegisub/*.h haven't been converted yet, this will be done in a later commit
* Some documentation blocks are in the wrong place, in the .h when it should be in the .cpp, or vice versa.
See http://devel.aegisub.org/wiki/Doxygen for some details on Doxygen and a 'style guide'.
Originally committed to SVN as r3312.
2009-07-30 00:59:22 +02:00
|
|
|
|
|
|
|
/// @brief This is needed because wxIcon has to be 16x16 to work properly on win32 Convert a wxBitmap to wxIcon
|
|
|
|
/// @param iconBmp
|
|
|
|
/// @return
|
|
|
|
///
|
2007-07-05 01:09:40 +02:00
|
|
|
wxIcon BitmapToIcon(wxBitmap iconBmp) {
|
|
|
|
// Create the icon and background bmp
|
|
|
|
wxIcon ico;
|
|
|
|
wxBitmap bmp(16,16);
|
|
|
|
|
|
|
|
// Blit bitmap into 16x16 one (don't remove brackets)
|
|
|
|
{
|
|
|
|
wxMemoryDC dc;
|
|
|
|
dc.SelectObject(bmp);
|
|
|
|
dc.SetBackground(wxColour(192,192,192));
|
|
|
|
dc.Clear();
|
|
|
|
dc.DrawBitmap(iconBmp,0,0,false);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create mask and convert to icon
|
|
|
|
wxMask *mask = new wxMask(bmp,wxColour(192,192,192));
|
|
|
|
bmp.SetMask(mask);
|
|
|
|
ico.CopyFromBitmap(bmp);
|
|
|
|
return ico;
|
|
|
|
}
|
2009-01-04 12:45:06 +01:00
|
|
|
|
Note: This was done using a script! it's far from perfect but 95% of the work has been done already formatting-wise.
Document all functions, class, struct, union, enum, macro, variable, typedefs. This isn't the actual document in itself but empty documentation using any old documentation if it was there.
This was done using exuberant ctags to get tag info, then a TCL script to parse/remove old comments and convert them into Doxygen-style.
Some notes:
* Anything labeled 'DOCME' needs to be documented, @param and @return have been left blank as it would be annoying to delete the 'DOCME' from every one of those.
* Some multiline comments may have been munged into single line comments
* Leave the /// comments above global variables with a space, if they're harder to read then we'll be less likey to use them.
* Enum comments can go after the enumeration itself '[value] /// comment'
* include/aegisub/*.h haven't been converted yet, this will be done in a later commit
* Some documentation blocks are in the wrong place, in the .h when it should be in the .cpp, or vice versa.
See http://devel.aegisub.org/wiki/Doxygen for some details on Doxygen and a 'style guide'.
Originally committed to SVN as r3312.
2009-07-30 00:59:22 +02:00
|
|
|
|
|
|
|
/// @brief just before this is called. It is assumed that something has prepared closing the current instance Start Aegisub again
|
|
|
|
///
|
2009-01-04 12:45:06 +01:00
|
|
|
void RestartAegisub() {
|
|
|
|
#if defined(__WXMSW__)
|
|
|
|
wxStandardPaths stand;
|
2011-09-28 21:43:11 +02:00
|
|
|
wxExecute("\"" + stand.GetExecutablePath() + "\"");
|
2009-01-04 12:45:06 +01:00
|
|
|
#elif defined(__WXMAC__)
|
2010-08-14 19:42:37 +02:00
|
|
|
char *bundle_path = agi::util::OSX_GetBundlePath();
|
|
|
|
char *support_path = agi::util::OSX_GetBundleSupportFilesDirectory();
|
2009-01-12 23:54:58 +01:00
|
|
|
if (!bundle_path || !support_path) return; // oops
|
2011-09-28 21:43:48 +02:00
|
|
|
wxString exec = wxString::Format("\"%s/MacOS/restart-helper\" /usr/bin/open -n \"%s\"'", wxString(support_path, wxConvUTF8), wxString(bundle_path, wxConvUTF8));
|
2010-06-09 01:21:39 +02:00
|
|
|
LOG_I("util/restart/exec") << exec;
|
2010-01-21 01:26:45 +01:00
|
|
|
wxExecute(exec);
|
|
|
|
free(bundle_path);
|
2009-01-12 23:54:58 +01:00
|
|
|
free(support_path);
|
2009-01-04 12:45:06 +01:00
|
|
|
#else
|
2009-01-12 22:26:44 +01:00
|
|
|
wxStandardPaths stand;
|
|
|
|
wxExecute(stand.GetExecutablePath());
|
2009-01-04 12:45:06 +01:00
|
|
|
#endif
|
|
|
|
}
|
2009-07-29 07:43:02 +02:00
|
|
|
|
2011-10-25 21:40:45 +02:00
|
|
|
bool ForwardMouseWheelEvent(wxWindow *source, wxMouseEvent &evt) {
|
|
|
|
wxWindow *target = wxFindWindowAtPoint(wxGetMousePosition());
|
|
|
|
if (!target || target == source) return true;
|
|
|
|
|
|
|
|
// If the mouse is over a parent of the source window just pretend it's
|
|
|
|
// over the source window, so that the mouse wheel works on borders and such
|
|
|
|
wxWindow *parent = source->GetParent();
|
|
|
|
while (parent && parent != target) parent = parent->GetParent();
|
|
|
|
if (parent == target) return true;
|
|
|
|
|
|
|
|
// Otherwise send it to the new target
|
|
|
|
target->GetEventHandler()->ProcessEvent(evt);
|
|
|
|
evt.Skip(false);
|
|
|
|
return false;
|
|
|
|
}
|