diff options
Diffstat (limited to 'src/qregisters.cpp')
-rw-r--r-- | src/qregisters.cpp | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/qregisters.cpp b/src/qregisters.cpp index 1a7ba34..115cd36 100644 --- a/src/qregisters.cpp +++ b/src/qregisters.cpp @@ -617,21 +617,38 @@ StateGetQRegInteger::got_register(QRegister ®) } /*$ - * [n]Uq -- Set Q-Register integer + * nUq -- Set Q-Register integer + * -Uq + * [n]:Uq -> Success|Failure * * Sets the integer-part of Q-Register <q> to <n>. - * If <n> is omitted, the sign prefix is implied. + * \(lq-U\(rq is equivalent to \(lq-1U\(rq, otherwise + * the command fails if <n> is missing. + * + * If the command is colon-modified, it returns a success + * boolean if <n> or \(lq-\(rq is given. + * Otherwise it returns a failure boolean and does not + * modify <q>. * * The register is defined if it does not exist. */ -/** @bug perhaps it's better to imply 0! */ State * StateSetQRegInteger::got_register(QRegister ®) { BEGIN_EXEC(&States::start); - reg.undo_set_integer(); - reg.set_integer(expressions.pop_num_calc()); + expressions.eval(); + if (expressions.args() || expressions.num_sign < 0) { + reg.undo_set_integer(); + reg.set_integer(expressions.pop_num_calc()); + + if (eval_colon()) + expressions.push(SUCCESS); + } else if (eval_colon()) { + expressions.push(FAILURE); + } else { + throw ArgExpectedError('U'); + } return &States::start; } |