summaryrefslogtreecommitdiff
path: root/main/app.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/app.c')
-rw-r--r--main/app.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/main/app.c b/main/app.c
index 99dcfa677..580e91b76 100644
--- a/main/app.c
+++ b/main/app.c
@@ -2082,3 +2082,59 @@ void ast_safe_fork_cleanup(void)
ast_unreplace_sigchld();
}
+int ast_app_parse_timelen(const char *timestr, int *result, ast_timelen unit)
+{
+ int res;
+ char u[10];
+#ifdef HAVE_LONG_DOUBLE_WIDER
+ long double amount;
+ #define FMT "%30Lf%9s"
+#else
+ double amount;
+ #define FMT "%30lf%9s"
+#endif
+ if (!timestr) {
+ return -1;
+ }
+
+ if ((res = sscanf(timestr, FMT, &amount, u)) == 0) {
+#undef FMT
+ return -1;
+ } else if (res == 2) {
+ switch (u[0]) {
+ case 'h':
+ case 'H':
+ unit = TIMELEN_HOURS;
+ break;
+ case 's':
+ case 'S':
+ unit = TIMELEN_SECONDS;
+ break;
+ case 'm':
+ case 'M':
+ if (toupper(u[1]) == 'S') {
+ unit = TIMELEN_MILLISECONDS;
+ } else if (u[1] == '\0') {
+ unit = TIMELEN_MINUTES;
+ }
+ break;
+ }
+ }
+
+ switch (unit) {
+ case TIMELEN_HOURS:
+ amount *= 60;
+ /* fall-through */
+ case TIMELEN_MINUTES:
+ amount *= 60;
+ /* fall-through */
+ case TIMELEN_SECONDS:
+ amount *= 1000;
+ /* fall-through */
+ case TIMELEN_MILLISECONDS:
+ ;
+ }
+ *result = amount > INT_MAX ? INT_MAX : (int) amount;
+ return 0;
+}
+