/*
* Copyright (C) 2012-2015 Robin Haberkorn
*
* 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 .
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include
#include "sciteco.h"
#include "string-utils.h"
namespace SciTECO {
/**
* Canonicalize control characters in str.
* This converts all control characters to printable
* characters without tabs, line feeds, etc.
* Useful for displaying Q-Register names and
* TECO code.
*/
gchar *
String::canonicalize_ctl(const gchar *str)
{
gsize ret_len = 1; /* for trailing 0 */
gchar *ret, *p;
/*
* Instead of approximating size with strlen()
* we can just as well calculate it exactly:
*/
for (const gchar *p = str; *p; p++)
ret_len += IS_CTL(*p) ? 2 : 1;
p = ret = (gchar *)g_malloc(ret_len);
while (*str) {
if (IS_CTL(*str)) {
*p++ = '^';
*p++ = CTL_ECHO(*str++);
} else {
*p++ = *str++;
}
}
*p = '\0';
return ret;
}
void
String::get_coord(const gchar *str, gint pos,
gint &line, gint &column)
{
line = column = 1;
for (gint i = 0; i < pos; i++) {
switch (str[i]) {
case '\r':
if (str[i+1] == '\n')
i++;
/* fall through */
case '\n':
line++;
column = 1;
break;
default:
column++;
break;
}
}
}
} /* namespace SciTECO */