aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/qregisters.cpp
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2014-11-24 20:49:36 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2014-11-24 20:53:55 +0100
commitad3d2f4a63cddd312cdf3571c42b420b5b23e50e (patch)
treec0dd5470a75848e2fa9d342af3c9c10f1b6336ce /src/qregisters.cpp
parent0c87bad5abea3b362165fa4fdbf311e124dd608a (diff)
downloadsciteco-ad3d2f4a63cddd312cdf3571c42b420b5b23e50e.tar.gz
implemented pQq and :Qq commands
Diffstat (limited to 'src/qregisters.cpp')
-rw-r--r--src/qregisters.cpp122
1 files changed, 104 insertions, 18 deletions
diff --git a/src/qregisters.cpp b/src/qregisters.cpp
index 940ce23..e16224f 100644
--- a/src/qregisters.cpp
+++ b/src/qregisters.cpp
@@ -47,12 +47,12 @@ namespace States {
StateLoadQReg loadqreg;
StateEPctCommand epctcommand;
StateSaveQReg saveqreg;
+ StateQueryQReg queryqreg;
StateCtlUCommand ctlucommand;
StateEUCommand eucommand;
StateSetQRegString setqregstring_nobuilding(false);
StateSetQRegString setqregstring_building(true);
StateGetQRegString getqregstring;
- StateGetQRegInteger getqreginteger;
StateSetQRegInteger setqreginteger;
StateIncreaseQReg increaseqreg;
StateMacro macro;
@@ -158,6 +158,49 @@ QRegisterData::get_string(void)
return str;
}
+gsize
+QRegisterData::get_string_size(void)
+{
+ gsize size;
+
+ if (!string.is_initialized())
+ return 0;
+
+ if (QRegisters::current)
+ QRegisters::current->string.update(QRegisters::view);
+
+ string.edit(QRegisters::view);
+
+ size = QRegisters::view.ssm(SCI_GETLENGTH);
+
+ if (QRegisters::current)
+ QRegisters::current->string.edit(QRegisters::view);
+
+ return size;
+}
+
+gint
+QRegisterData::get_character(gint position)
+{
+ gint ret = -1;
+
+ if (position < 0)
+ return -1;
+
+ if (QRegisters::current)
+ QRegisters::current->string.update(QRegisters::view);
+
+ string.edit(QRegisters::view);
+
+ if (position < QRegisters::view.ssm(SCI_GETLENGTH))
+ ret = QRegisters::view.ssm(SCI_GETCHARAT, position);
+
+ if (QRegisters::current)
+ QRegisters::current->string.edit(QRegisters::view);
+
+ return ret;
+}
+
void
QRegister::edit(void)
{
@@ -276,6 +319,21 @@ QRegisterBufferInfo::get_string(void)
return g_strdup(ring.current->filename ? : "");
}
+gsize
+QRegisterBufferInfo::get_string_size(void)
+{
+ return ring.current->filename ? strlen(ring.current->filename) : 0;
+}
+
+gint
+QRegisterBufferInfo::get_character(gint position)
+{
+ if (position < 0 || position >= (gint)get_string_size())
+ return -1;
+
+ return ring.current->filename[position];
+}
+
void
QRegisterBufferInfo::edit(void)
{
@@ -661,6 +719,51 @@ StateSaveQReg::done(const gchar *str)
}
/*$
+ * Qq -> n -- Query Q-Register integer or string
+ * <position>Qq -> character
+ * :Qq -> size
+ *
+ * Without any arguments, get and return the integer-part of
+ * Q-Register <q>.
+ *
+ * With one argument, return the <character> code at <position>
+ * from the string-part of Q-Register <q>.
+ * Positions are handled like buffer positions \(em they
+ * begin at 0 up to the length of the string minus 1.
+ * An error is thrown for invalid positions.
+ *
+ * When colon-modified, Q does not pop any arguments from
+ * the expression stack and returns the <size> of the string
+ * in Q-Register <q>.
+ * Naturally, for empty strings, 0 is returned.
+ *
+ * The command fails for undefined registers.
+ */
+State *
+StateQueryQReg::got_register(QRegister &reg)
+{
+ BEGIN_EXEC(&States::start);
+
+ expressions.eval();
+
+ if (eval_colon()) {
+ /* Query Q-Register string size */
+ expressions.push(reg.get_string_size());
+ } else if (expressions.args() > 0) {
+ /* Query character from Q-Register string */
+ gint c = reg.get_character(expressions.pop_num_calc());
+ if (c < 0)
+ throw RangeError('Q');
+ expressions.push(c);
+ } else {
+ /* Query integer */
+ expressions.push(reg.get_integer());
+ }
+
+ return &States::start;
+}
+
+/*$
* [c1,c2,...]^Uq[string]$ -- Set or append to Q-Register string without string building
* [c1,c2,...]:^Uq[string]$
*
@@ -794,23 +897,6 @@ StateGetQRegString::got_register(QRegister &reg)
}
/*$
- * Qq -> n -- Query Q-Register integer
- *
- * Gets and returns the integer-part of Q-Register <q>.
- * The command fails for undefined registers.
- */
-State *
-StateGetQRegInteger::got_register(QRegister &reg)
-{
- BEGIN_EXEC(&States::start);
-
- expressions.eval();
- expressions.push(reg.get_integer());
-
- return &States::start;
-}
-
-/*$
* nUq -- Set Q-Register integer
* -Uq
* [n]:Uq -> Success|Failure