From: Samual Lenks Date: Mon, 4 Mar 2013 20:32:13 +0000 (-0500) Subject: Move time processing and counting to counting.qh X-Git-Tag: xonotic-v0.7.0~62^2~23^2~8 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=132c0b023f7b022317d0217130d8f03629c7ad3e;p=xonotic%2Fxonotic-data.pk3dir.git Move time processing and counting to counting.qh --- diff --git a/qcsrc/client/progs.src b/qcsrc/client/progs.src index 0439bd8b4..3b8aa1bac 100644 --- a/qcsrc/client/progs.src +++ b/qcsrc/client/progs.src @@ -16,6 +16,7 @@ Defs.qc ../common/teams.qh ../common/util.qh +../common/counting.qh ../common/items.qh ../common/explosion_equation.qh ../common/mapinfo.qh diff --git a/qcsrc/common/counting.qh b/qcsrc/common/counting.qh new file mode 100644 index 000000000..a74f74e98 --- /dev/null +++ b/qcsrc/common/counting.qh @@ -0,0 +1,199 @@ +// =============================================== +// Time processing and counting functions/macros +// =============================================== + +#define count_years_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s years")), ftos_decimals(time, decs)) +#define count_years(time) count_fill(time, \ + ZCTX(_("CI_ZER^%d years")), /* zeroth */ \ + ZCTX(_("CI_FIR^%d year")), /* first */ \ + ZCTX(_("CI_SEC^%d years")), /* year */ \ + ZCTX(_("CI_THI^%d years")), /* third */ \ + ZCTX(_("CI_MUL^%d years"))) /* multi */ + +#define count_weeks_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s weeks")), ftos_decimals(time, decs)) +#define count_weeks(time) count_fill(time, \ + ZCTX(_("CI_ZER^%d weeks")), /* zeroth */ \ + ZCTX(_("CI_FIR^%d week")), /* first */ \ + ZCTX(_("CI_SEC^%d weeks")), /* week */ \ + ZCTX(_("CI_THI^%d weeks")), /* third */ \ + ZCTX(_("CI_MUL^%d weeks"))) /* multi */ + +#define count_days_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s days")), ftos_decimals(time, decs)) +#define count_days(time) count_fill(time, \ + ZCTX(_("CI_ZER^%d days")), /* zeroth */ \ + ZCTX(_("CI_FIR^%d day")), /* first */ \ + ZCTX(_("CI_SEC^%d days")), /* day */ \ + ZCTX(_("CI_THI^%d days")), /* third */ \ + ZCTX(_("CI_MUL^%d days"))) /* multi */ + +#define count_hours_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s hours")), ftos_decimals(time, decs)) +#define count_hours(time) count_fill(time, \ + ZCTX(_("CI_ZER^%d hours")), /* zeroth */ \ + ZCTX(_("CI_FIR^%d hour")), /* first */ \ + ZCTX(_("CI_SEC^%d hours")), /* hour */ \ + ZCTX(_("CI_THI^%d hours")), /* third */ \ + ZCTX(_("CI_MUL^%d hours"))) /* multi */ + + +#define count_minutes_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s minutes")), ftos_decimals(time, decs)) +#define count_minutes(time) count_fill(time, \ + ZCTX(_("CI_ZER^%d minutes")), /* zeroth */ \ + ZCTX(_("CI_FIR^%d minute")), /* first */ \ + ZCTX(_("CI_SEC^%d minutes")), /* minute */ \ + ZCTX(_("CI_THI^%d minutes")), /* third */ \ + ZCTX(_("CI_MUL^%d minutes"))) /* multi */ + +#define count_seconds_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s seconds")), ftos_decimals(time, decs)) +#define count_seconds(time) count_fill(time, \ + ZCTX(_("CI_ZER^%d seconds")), /* zeroth */ \ + ZCTX(_("CI_FIR^%d second")), /* first */ \ + ZCTX(_("CI_SEC^%d seconds")), /* second */ \ + ZCTX(_("CI_THI^%d seconds")), /* third */ \ + ZCTX(_("CI_MUL^%d seconds"))) /* multi */ + +string count_ordinal(float interval) +{ + // This function is designed primarily for the English language, it's impossible + // to accomodate all languages unless we do a specific function for each one... + // and since that's not technically feasible/practical, this is all we've got folks. + + // Basically, it just allows you to represent a number or count in different ways + // depending on the number... like, with count_ordinal you can provide integers + // and retrieve 1st, 2nd, 3rd, nth ordinal numbers in a clean and simple way. + if(floor((mod(interval, 100))/10) * 10 != 10) // examples: 12th, 111th, 213th will not execute this block + { + // otherwise, check normally for 1st,2nd,3rd insertions + switch(mod(interval, 10)) + { + case 1: return sprintf(_("%dst"), interval); + case 2: return sprintf(_("%dnd"), interval); + case 3: return sprintf(_("%drd"), interval); + default: return sprintf(_("%dth"), interval); + } + } + else { return sprintf(_("%dth"), interval); } + + return ""; +} + +string count_fill(float interval, string zeroth, string first, string second, string third, string multi) +{ + // This function is designed primarily for the English language, it's impossible + // to accomodate all languages unless we do a specific function for each one... + // and since that's not technically feasible/practical, this is all we've got folks. + + // Here you can insert specific strings based on the interval number, so you could do + // i.e. count_seconds which outputs like this: + // 0 seconds + // 1 second + // 2 seconds + // 3 seconds + // etc... minutes, hours, days, etc. + + switch(floor(interval)) + { + case 0: return sprintf(zeroth, interval); + case 1: + { + if(interval == 1) // EXACTLY value of 1 + return sprintf(first, interval); + else + return sprintf(multi, interval); + } + case 2: return sprintf(second, interval); + case 3: return sprintf(third, interval); + default: return sprintf(multi, interval); + } + return ""; +} + +string process_time(float outputtype, float seconds) +{ + float tmp_hours = 0, tmp_minutes = 0, tmp_seconds = 0; + float tmp_years = 0, tmp_weeks = 0, tmp_days = 0; + + tmp_seconds = floor(seconds); + + if(tmp_seconds) + { + tmp_minutes = floor(tmp_seconds / 60); + + if(tmp_minutes) + { + tmp_seconds -= (tmp_minutes * 60); + tmp_hours = floor(tmp_minutes / 60); + + if(tmp_hours) + { + tmp_minutes -= (tmp_hours * 60); + tmp_days = floor(tmp_hours / 24); + + if(tmp_days) + { + tmp_hours -= (tmp_days * 24); + tmp_weeks = floor(tmp_days / 7); + + if(tmp_weeks) + { + tmp_days -= (tmp_weeks * 7); + tmp_years = floor(tmp_weeks / 52); + } + } + } + } + } + + switch(outputtype) + { + case 1: return sprintf("%02d:%02d:%02d", tmp_hours, tmp_minutes, tmp_seconds); + case 2: + { + string output = ""; + + output = count_seconds(tmp_seconds); + + if(tmp_minutes) + { + output = sprintf( + "%s%s", + count_minutes(tmp_minutes), + ((output != "") ? sprintf(", %s", output) : "")); + } + + if(tmp_hours) + { + output = sprintf( + "%s%s", + count_hours(tmp_hours), + ((output != "") ? sprintf(", %s", output) : "")); + } + + if(tmp_days) + { + output = sprintf( + "%s%s", + count_days(tmp_days), + ((output != "") ? sprintf(", %s", output) : "")); + } + + if(tmp_weeks) + { + output = sprintf( + "%s%s", + count_weeks(tmp_weeks), + ((output != "") ? sprintf(", %s", output) : "")); + } + + if(tmp_years) + { + output = sprintf( + "%s%s", + count_years(tmp_years), + ((output != "") ? sprintf(", %s", output) : "")); + } + + return output; + } + } + return ""; +} diff --git a/qcsrc/common/util.qc b/qcsrc/common/util.qc index 4cb51f0af..9db09a243 100644 --- a/qcsrc/common/util.qc +++ b/qcsrc/common/util.qc @@ -2504,32 +2504,6 @@ void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t queue_start.FindConnectedComponent_processing = 0; } -float Count_Proper_Strings(string improper, string...count) -{ - float i, total = 0; - string tmp; - - for(i = 0; i < count; ++i) - { - tmp = ...(i, string); - if((tmp) && (tmp != improper)) { ++total; } - } - - return total; -} - -float Count_Proper_Floats(float improper, float...count) -{ - float i, total = 0; - - for(i = 0; i < count; ++i) - { - if(...(i, float) != improper) { ++total; } - } - - return total; -} - // todo: this sucks, lets find a better way to do backtraces? #ifndef MENUQC void backtrace(string msg) @@ -2606,153 +2580,6 @@ vector animfixfps(entity e, vector a, vector b) } #endif -string count_ordinal(float interval) -{ - // This function is designed primarily for the English language, it's impossible - // to accomodate all languages unless we do a specific function for each one... - // and since that's not technically feasible/practical, this is all we've got folks. - - // Basically, it just allows you to represent a number or count in different ways - // depending on the number... like, with count_ordinal you can provide integers - // and retrieve 1st, 2nd, 3rd, nth ordinal numbers in a clean and simple way. - if(floor((mod(interval, 100))/10) * 10 != 10) // examples: 12th, 111th, 213th will not execute this block - { - // otherwise, check normally for 1st,2nd,3rd insertions - switch(mod(interval, 10)) - { - case 1: return sprintf(_("%dst"), interval); - case 2: return sprintf(_("%dnd"), interval); - case 3: return sprintf(_("%drd"), interval); - default: return sprintf(_("%dth"), interval); - } - } - else { return sprintf(_("%dth"), interval); } - - return ""; -} - -string count_fill(float interval, string zeroth, string first, string second, string third, string multi) -{ - // This function is designed primarily for the English language, it's impossible - // to accomodate all languages unless we do a specific function for each one... - // and since that's not technically feasible/practical, this is all we've got folks. - - // Here you can insert specific strings based on the interval number, so you could do - // i.e. count_seconds which outputs like this: - // 0 seconds - // 1 second - // 2 seconds - // 3 seconds - // etc... minutes, hours, days, etc. - - switch(floor(interval)) - { - case 0: return sprintf(zeroth, interval); - case 1: - { - if(interval == 1) // EXACTLY value of 1 - return sprintf(first, interval); - else - return sprintf(multi, interval); - } - case 2: return sprintf(second, interval); - case 3: return sprintf(third, interval); - default: return sprintf(multi, interval); - } - return ""; -} - -string process_time(float outputtype, float seconds) -{ - float tmp_hours = 0, tmp_minutes = 0, tmp_seconds = 0; - float tmp_years = 0, tmp_weeks = 0, tmp_days = 0; - - tmp_seconds = floor(seconds); - - if(tmp_seconds) - { - tmp_minutes = floor(tmp_seconds / 60); - - if(tmp_minutes) - { - tmp_seconds -= (tmp_minutes * 60); - tmp_hours = floor(tmp_minutes / 60); - - if(tmp_hours) - { - tmp_minutes -= (tmp_hours * 60); - tmp_days = floor(tmp_hours / 24); - - if(tmp_days) - { - tmp_hours -= (tmp_days * 24); - tmp_weeks = floor(tmp_days / 7); - - if(tmp_weeks) - { - tmp_days -= (tmp_weeks * 7); - tmp_years = floor(tmp_weeks / 52); - } - } - } - } - } - - switch(outputtype) - { - case 1: return sprintf("%02d:%02d:%02d", tmp_hours, tmp_minutes, tmp_seconds); - case 2: - { - string output = ""; - - output = count_seconds(tmp_seconds); - - if(tmp_minutes) - { - output = sprintf( - "%s%s", - count_minutes(tmp_minutes), - ((output != "") ? sprintf(", %s", output) : "")); - } - - if(tmp_hours) - { - output = sprintf( - "%s%s", - count_hours(tmp_hours), - ((output != "") ? sprintf(", %s", output) : "")); - } - - if(tmp_days) - { - output = sprintf( - "%s%s", - count_days(tmp_days), - ((output != "") ? sprintf(", %s", output) : "")); - } - - if(tmp_weeks) - { - output = sprintf( - "%s%s", - count_weeks(tmp_weeks), - ((output != "") ? sprintf(", %s", output) : "")); - } - - if(tmp_years) - { - output = sprintf( - "%s%s", - count_years(tmp_years), - ((output != "") ? sprintf(", %s", output) : "")); - } - - return output; - } - } - return ""; -} - #ifdef SVQC void dedicated_print(string input) // print(), but only print if the server is not local { diff --git a/qcsrc/common/util.qh b/qcsrc/common/util.qh index 8532eff70..bd603b74c 100644 --- a/qcsrc/common/util.qh +++ b/qcsrc/common/util.qh @@ -377,9 +377,6 @@ void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t // expand multiple arguments into one argument by stripping parenthesis #define XPD(...) __VA_ARGS__ -float Count_Proper_Strings(string improper, string...count); -float Count_Proper_Floats(float improper, float...count); - #ifndef MENUQC void backtrace(string msg); #endif @@ -419,59 +416,6 @@ vector vec3(float x, float y, float z); vector animfixfps(entity e, vector a, vector b); #endif -#define count_years_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s years")), ftos_decimals(time, decs)) -#define count_years(time) count_fill(time, \ - ZCTX(_("CI_ZER^%d years")), /* zeroth */ \ - ZCTX(_("CI_FIR^%d year")), /* first */ \ - ZCTX(_("CI_SEC^%d years")), /* year */ \ - ZCTX(_("CI_THI^%d years")), /* third */ \ - ZCTX(_("CI_MUL^%d years"))) /* multi */ - -#define count_weeks_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s weeks")), ftos_decimals(time, decs)) -#define count_weeks(time) count_fill(time, \ - ZCTX(_("CI_ZER^%d weeks")), /* zeroth */ \ - ZCTX(_("CI_FIR^%d week")), /* first */ \ - ZCTX(_("CI_SEC^%d weeks")), /* week */ \ - ZCTX(_("CI_THI^%d weeks")), /* third */ \ - ZCTX(_("CI_MUL^%d weeks"))) /* multi */ - -#define count_days_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s days")), ftos_decimals(time, decs)) -#define count_days(time) count_fill(time, \ - ZCTX(_("CI_ZER^%d days")), /* zeroth */ \ - ZCTX(_("CI_FIR^%d day")), /* first */ \ - ZCTX(_("CI_SEC^%d days")), /* day */ \ - ZCTX(_("CI_THI^%d days")), /* third */ \ - ZCTX(_("CI_MUL^%d days"))) /* multi */ - -#define count_hours_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s hours")), ftos_decimals(time, decs)) -#define count_hours(time) count_fill(time, \ - ZCTX(_("CI_ZER^%d hours")), /* zeroth */ \ - ZCTX(_("CI_FIR^%d hour")), /* first */ \ - ZCTX(_("CI_SEC^%d hours")), /* hour */ \ - ZCTX(_("CI_THI^%d hours")), /* third */ \ - ZCTX(_("CI_MUL^%d hours"))) /* multi */ - - -#define count_minutes_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s minutes")), ftos_decimals(time, decs)) -#define count_minutes(time) count_fill(time, \ - ZCTX(_("CI_ZER^%d minutes")), /* zeroth */ \ - ZCTX(_("CI_FIR^%d minute")), /* first */ \ - ZCTX(_("CI_SEC^%d minutes")), /* minute */ \ - ZCTX(_("CI_THI^%d minutes")), /* third */ \ - ZCTX(_("CI_MUL^%d minutes"))) /* multi */ - -#define count_seconds_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s seconds")), ftos_decimals(time, decs)) -#define count_seconds(time) count_fill(time, \ - ZCTX(_("CI_ZER^%d seconds")), /* zeroth */ \ - ZCTX(_("CI_FIR^%d second")), /* first */ \ - ZCTX(_("CI_SEC^%d seconds")), /* second */ \ - ZCTX(_("CI_THI^%d seconds")), /* third */ \ - ZCTX(_("CI_MUL^%d seconds"))) /* multi */ - -string count_ordinal(float interval); -string count_fill(float interval, string zeroth, string first, string second, string third, string multi); -string process_time(float outputtype, float seconds); - #ifdef SVQC void dedicated_print(string input); #endif diff --git a/qcsrc/menu/progs.src b/qcsrc/menu/progs.src index 47db61ba7..36905e17a 100644 --- a/qcsrc/menu/progs.src +++ b/qcsrc/menu/progs.src @@ -18,6 +18,7 @@ oo/base.h ../common/mapinfo.qh ../common/campaign_common.qh ../common/items.qh +../common/counting.qh ../common/command/markup.qh ../common/command/rpn.qh ../common/command/generic.qh diff --git a/qcsrc/server/progs.src b/qcsrc/server/progs.src index 54bc0b8c7..a00fd32c5 100644 --- a/qcsrc/server/progs.src +++ b/qcsrc/server/progs.src @@ -15,6 +15,7 @@ sys-post.qh ../common/constants.qh ../common/teams.qh ../common/util.qh +../common/counting.qh ../common/items.qh ../common/explosion_equation.qh ../common/urllib.qh