Skip to content

Instantly share code, notes, and snippets.

@asquelt
Created May 5, 2013 22:00
Show Gist options
  • Save asquelt/5522355 to your computer and use it in GitHub Desktop.
Save asquelt/5522355 to your computer and use it in GitHub Desktop.
#include "num2words-en.h"
#include "num2words-common.h"
#include "string.h"
// ęóąć - available
// śłżźń - absent
static const char* const ONES[] = {
"",
"jeden",
"dwie",
"trzy",
"cztery",
"pięć",
"szesć",
"siedem",
"osiem",
"dziewięć",
"dziesięć",
"jedenascie",
"dwanascie",
"trzynascie",
"czternascie",
"piętnascie",
"szesnascie",
"siedemnascie",
"osiemnascie",
"dziewiętnascie"
};
static const char* const TENS[] = {
"",
"dziesięć",
"dwadziescia",
"trzydziesci",
"czterdziesci",
"pięćdziesiąt",
"szesćdziedziąt",
"siedemdziesiąt",
"osiemdziesiąt",
"dziewięćdziesiąt"
};
static const char* const H_ONES[] = {
"",
"pierwsz",
"drug",
"trzeci",
"czwart",
"piąt",
"szóst",
"siódm",
"ósm",
"dziewiąt",
"dziesiąt",
"jedenast",
"dwunast",
"trzynast",
"czternast",
"piętnast",
"szesnast",
"siedemnast",
"osiemnast",
"dziewiętnast"
};
static const char* const H_TENS[] = {
"",
"dziesiąt",
"dwudziest",
};
static const char* STR_PUNKT = "punkt";
static const char* STR_POLUDNIE = "poludnie";
static const char* STR_POLNOC = "pólnoc";
static const char* STR_KWADRANS = "kwadrans";
static const char* STR_WPOL = "wpól";
static const char* STR_DO = "do";
static const char* STR_ZA = "za";
static const char* STR_PO = "po";
static const char* STR_RANO = "rano";
static const char* STR_PO_GODZINIE = "a";
static const char* STR_DO_GODZINY = "ej";
static const char* STR_DO_GODZINY2 = "iej";
static const char* STR_MINUTA = "minuta";
static const char* STR_MINUTE = "minutę";
static size_t num2words_pl(char* words, int num) {
size_t len = 0;
if (num < 20) {
strcat(words, ONES[num]);
return strlen(ONES[num]);
} else {
int tens_val = num / 10 % 10;
int ones_val = num % 10;
strcat(words, TENS[tens_val]);
len += strlen(TENS[tens_val]);
if (ones_val > 0) {
strcat(words, " ");
len += 1;
strcat(words, ONES[ones_val]);
len += strlen(ONES[ones_val]);
}
}
return len;
}
static size_t h_num2words_pl(char* words, int num) {
size_t len = 0;
if (num == 0) {
strcat(words, H_ONES[12]);
return strlen(H_ONES[12]);
} else if (num < 20) {
strcat(words, H_ONES[num]);
return strlen(H_ONES[num]);
} else {
int tens_val = num / 10 % 10;
int ones_val = num % 10;
strcat(words, H_TENS[tens_val]);
len += strlen(H_TENS[tens_val]);
if (ones_val > 0) {
strcat(words, " ");
len += 1;
strcat(words, H_ONES[ones_val]);
len += strlen(H_ONES[ones_val]);
}
}
return len;
}
void time2words_pl(int hours, int minutes, bool twentyfourhours, bool longtime, bool leadingzero, bool ampm, char* hourstring, size_t hourstring_length, char* minutestring, size_t minutestring_length) {
size_t hourstring_remaining = hourstring_length;
size_t minutestring_remaining = minutestring_length;
memset(hourstring, 0, hourstring_length);
memset(minutestring, 0, minutestring_length);
if (minutes >= 60) {
// if rounded up by ROUNDING
minutes = 0;
hours = (hours + 1) % 24;
}
if (longtime) { // twentyfour to midnight
if (minutes == 0) {
// leave minutestring empty
} else if (minutes < 31) {
if (minutes == 1) {
minutestring_remaining -= append_string(minutestring, minutestring_remaining, STR_MINUTA);
minutestring_remaining -= append_string(minutestring, minutestring_remaining, " ");
minutestring_remaining -= append_string(minutestring, minutestring_remaining, STR_PO);
} else if (minutes == 15) {
minutestring_remaining -= append_string(minutestring, minutestring_remaining, STR_KWADRANS);
minutestring_remaining -= append_string(minutestring, minutestring_remaining, " ");
minutestring_remaining -= append_string(minutestring, minutestring_remaining, STR_PO);
} else if (minutes == 30) {
minutestring_remaining -= append_string(minutestring, minutestring_remaining, STR_WPOL);
minutestring_remaining -= append_string(minutestring, minutestring_remaining, " ");
minutestring_remaining -= append_string(minutestring, minutestring_remaining, STR_DO);
hours = (hours + 1) % 24;
} else {
if (leadingzero && minutes < 10) {
minutestring_remaining -= num2words_pl(minutestring, 0);
minutestring_remaining -= append_string(minutestring, minutestring_remaining, " ");
}
minutestring_remaining -= num2words_pl(minutestring, minutes);
minutestring_remaining -= append_string(minutestring, minutestring_remaining, " ");
minutestring_remaining -= append_string(minutestring, minutestring_remaining, STR_PO);
}
} else { // minutes > 30
minutestring_remaining -= append_string(minutestring, minutestring_remaining, STR_ZA);
minutestring_remaining -= append_string(minutestring, minutestring_remaining, " ");
if (minutes == 59) {
minutestring_remaining -= append_string(minutestring, minutestring_remaining, STR_MINUTE);
} else if (minutes == 45) {
minutestring_remaining -= append_string(minutestring, minutestring_remaining, STR_KWADRANS);
} else {
minutestring_remaining -= num2words_pl(minutestring, (60 - minutes));
}
hours = (hours + 1) % 24;
}
if (hours == 0 && minutes == 0) {
hourstring_remaining -= append_string(hourstring, hourstring_remaining, STR_POLNOC);
} else if (hours == 12 && minutes == 0) {
hourstring_remaining -= append_string(hourstring, hourstring_remaining, STR_POLUDNIE);
} else {
if (twentyfourhours) {
hourstring_remaining -= h_num2words_pl(hourstring, hours);
} else {
hourstring_remaining -= h_num2words_pl(hourstring, hours % 12);
}
if (minutes == 0 || minutes > 30) {
hourstring_remaining -= append_string(hourstring, hourstring_remaining, STR_PO_GODZINIE);
} else {
if (hours == 2) {
hourstring_remaining -= append_string(hourstring, hourstring_remaining, STR_DO_GODZINY2);
} else {
hourstring_remaining -= append_string(hourstring, hourstring_remaining, STR_DO_GODZINY);
}
}
if (hours != 0 && hours != 12) {
if (ampm) {
if (hours < 12) {
hourstring_remaining -= append_string(hourstring, hourstring_remaining, " ");
hourstring_remaining -= append_string(hourstring, hourstring_remaining, STR_RANO);
}
}
if (minutes == 0) {
hourstring_remaining -= append_string(hourstring, hourstring_remaining, " ");
hourstring_remaining -= append_string(hourstring, hourstring_remaining, STR_PUNKT);
}
}
}
} else { // eleven thirtysix
if (leadingzero && minutes < 10) {
minutestring_remaining -= num2words_pl(minutestring, 0);
minutestring_remaining -= append_string(minutestring, minutestring_remaining, " ");
}
minutestring_remaining -= num2words_pl(minutestring, minutes);
if (hours == 0 && minutes == 0) {
hourstring_remaining -= append_string(hourstring, hourstring_remaining, STR_POLNOC);
} else if (hours == 12 && minutes == 0) {
hourstring_remaining -= append_string(hourstring, hourstring_remaining, STR_POLUDNIE);
} else {
if (twentyfourhours) {
hourstring_remaining -= h_num2words_pl(hourstring, hours);
} else {
hourstring_remaining -= h_num2words_pl(hourstring, hours % 12);
}
hourstring_remaining -= append_string(hourstring, hourstring_remaining, STR_PO_GODZINIE);
if (ampm && hours != 0 && hours != 12) {
if (hours < 12) {
hourstring_remaining -= append_string(hourstring, hourstring_remaining, " ");
hourstring_remaining -= append_string(hourstring, hourstring_remaining, STR_RANO);
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment