ft8_lib/ft8/text.cpp

117 lines
2.4 KiB
C++
Raw Normal View History

2018-10-24 15:35:06 +08:00
#include "text.h"
#include <string.h>
// Utility functions for characters and strings
char to_upper(char c) {
return (c >= 'a' && c <= 'z') ? (c - 'a' + 'A') : c;
}
bool is_digit(char c) {
return (c >= '0') && (c <= '9');
}
bool is_letter(char c) {
return ((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z'));
}
bool is_space(char c) {
return (c == ' ');
}
bool in_range(char c, char min, char max) {
return (c >= min) && (c <= max);
}
bool starts_with(const char *string, const char *prefix) {
return 0 == memcmp(string, prefix, strlen(prefix));
}
bool equals(const char *string1, const char *string2) {
return 0 == strcmp(string1, string2);
}
int char_index(const char *string, char c) {
for (int i = 0; *string; ++i, ++string) {
if (c == *string) {
return i;
}
}
return -1; // Not found
}
2018-10-24 15:35:06 +08:00
// Text message formatting:
// - replaces lowercase letters with uppercase
// - merges consecutive spaces into single space
void fmtmsg(char *msg_out, const char *msg_in) {
char c;
char last_out = 0;
while ( (c = *msg_in) ) {
if (c != ' ' || last_out != ' ') {
last_out = to_upper(c);
*msg_out = last_out;
++msg_out;
}
++msg_in;
}
*msg_out = 0; // Add zero termination
}
2018-10-28 16:39:39 +08:00
// Parse a 2 digit integer from string
int dd_to_int(const char *str, int length) {
int result = 0;
bool negative;
int i;
if (str[0] == '-') {
negative = true;
i = 1; // Consume the - sign
}
else {
negative = false;
i = (str[0] == '+') ? 1 : 0; // Consume a + sign if found
}
while (i < length) {
if (str[i] == 0) break;
if (!is_digit(str[i])) break;
result *= 10;
result += (str[i] - '0');
++i;
}
return negative ? -result : result;
}
// Convert a 2 digit integer to string
2018-12-24 20:22:26 +08:00
void int_to_dd(char *str, int value, int width, bool full_sign) {
2018-10-28 16:39:39 +08:00
if (value < 0) {
*str = '-';
++str;
value = -value;
}
2018-12-24 20:22:26 +08:00
else if (full_sign) {
2018-11-15 21:29:28 +08:00
*str = '+';
++str;
}
2018-10-28 16:39:39 +08:00
int divisor = 1;
2018-11-15 21:29:28 +08:00
for (int i = 0; i < width - 1; ++i) {
2018-10-28 16:39:39 +08:00
divisor *= 10;
}
2018-11-15 21:29:28 +08:00
while (divisor >= 1) {
2018-10-28 16:39:39 +08:00
int digit = value / divisor;
*str = '0' + digit;
++str;
value -= digit * divisor;
divisor /= 10;
}
*str = 0; // Add zero terminator
}