<p> Attention is currently required from: N A, Joshua Colp, George Joseph. </p>
<p>Patch set 13:<span style="border-radius: 3px; display: inline-block; margin: 0 2px; padding: 4px;background-color: #ffd4d4; color: #000000;">Code-Review -1</span></p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/16226">View Change</a></p><p>5 comments:</p><ul style="list-style: none; padding: 0;"><li style="margin: 0; padding: 0;"><p><a href="null">File funcs/func_sayfiles.c:</a></p><ul style="list-style: none; padding: 0;"><li style="margin: 0; padding: 0 0 0 16px;"><p style="margin-bottom: 4px;"><a href="https://gerrit.asterisk.org/c/asterisk/+/16226/comment/5717ef0c_60d1bf57">Patch Set #12, Line 165:</a> </p><p><blockquote style="border-left: 1px solid #aaa; margin: 10px 0; padding: 0 10px;"><pre style="font-family: monospace,monospace; white-space: pre-wrap;"> struct ast_str *expr, *result;<br><br> switch (cmd) {<br> case TEST_INIT:<br> info->name = "test_SAYFILES_function";<br> info->category = "/funcs/func_sayfiles/";<br> info->summary = "Test SAYFILES function substitution";<br> info->description =<br> "Executes a series of variable substitutions using the SAYFILES function and ensures that the expected results are received.";<br> return AST_TEST_NOT_RUN;<br> case TEST_EXECUTE:<br> break;<br> }<br><br> ast_test_status_update(test, "Testing SAYFILES() substitution ...\n");<br><br> if (!(expr = ast_str_create(16))) {<br> return AST_TEST_FAIL;<br> }<br> if (!(result = ast_str_create(16))) {<br> ast_free(expr);<br> return AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(hi Th3re,alpha)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "letters/h&letters/i&letters/space&letters/t&letters/h&digits/3&letters/r&letters/e") != 0) {<br> ast_test_status_update(test, "SAYFILES(hi Th3re,alpha) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(phreak,phonetic)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "phonetic/p_p&phonetic/h_p&phonetic/r_p&phonetic/e_p&phonetic/a_p&phonetic/k_p") != 0) {<br> ast_test_status_update(test, "SAYFILES(phreak,phonetic) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(35,digits)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/3&digits/5") != 0) {<br> ast_test_status_update(test, "SAYFILES(35,digits) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(35,number)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/30&digits/5") != 0) {<br> ast_test_status_update(test, "SAYFILES(35,number) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(1042,number)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/1&digits/thousand&digits/40&digits/2") != 0) {<br> ast_test_status_update(test, "SAYFILES(1042,number) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(0,number)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/0") != 0) {<br> ast_test_status_update(test, "SAYFILES(0,digits) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(2001000001,number)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/2&digits/billion&digits/1&digits/million&digits/1") != 0) {<br> ast_test_status_update(test, "SAYFILES(2001000001,number) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(7,ordinal)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/h-7") != 0) {<br> ast_test_status_update(test, "SAYFILES(7,ordinal) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(35,ordinal)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/30&digits/h-5") != 0) {<br> ast_test_status_update(test, "SAYFILES(35,ordinal) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(1042,ordinal)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/1&digits/thousand&digits/40&digits/h-2") != 0) {<br> ast_test_status_update(test, "SAYFILES(1042,ordinal) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(11042,ordinal)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/11&digits/thousand&digits/40&digits/h-2") != 0) {<br> ast_test_status_update(test, "SAYFILES(11042,ordinal) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(40000,ordinal)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/40&digits/h-thousand") != 0) {<br> ast_test_status_update(test, "SAYFILES(40000,ordinal) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(43638,ordinal)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/40&digits/3&digits/thousand&digits/6&digits/hundred&digits/30&digits/h-8") != 0) {<br> ast_test_status_update(test, "SAYFILES(43638,ordinal) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(1000000,ordinal)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/1&digits/h-million") != 0) {<br> ast_test_status_update(test, "SAYFILES(1000000,ordinal) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(1000001,ordinal)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/1&digits/million&digits/h-1") != 0) {<br> ast_test_status_update(test, "SAYFILES(1000001,ordinal) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(2001000001,ordinal)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/2&digits/billion&digits/1&digits/million&digits/h-1") != 0) {<br> ast_test_status_update(test, "SAYFILES(2001000001,ordinal) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(0,money)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/0¢s") != 0) {<br> ast_test_status_update(test, "SAYFILES(0,money) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(0.01,money)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/1¢") != 0) {<br> ast_test_status_update(test, "SAYFILES(0.01,money) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(0.42,money)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/40&digits/2¢s") != 0) {<br> ast_test_status_update(test, "SAYFILES(0.42,money) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(1.00,money)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/1&letters/dollar") != 0) {<br> ast_test_status_update(test, "SAYFILES(1.00,money) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(1.42,money)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/1&letters/dollar_&and&digits/40&digits/2¢s") != 0) {<br> ast_test_status_update(test, "SAYFILES(1.42,money) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(2.00,money)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/2&dollars") != 0) {<br> ast_test_status_update(test, "SAYFILES(2.00,money) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_str_set(&expr, 0, "${SAYFILES(2.42,money)}");<br> ast_str_substitute_variables(&result, 0, NULL, ast_str_buffer(expr));<br> if (strcmp(ast_str_buffer(result), "digits/2&dollars&and&digits/40&digits/2¢s") != 0) {<br> ast_test_status_update(test, "SAYFILES(2.42,money) test failed ('%s')\n",<br> ast_str_buffer(result));<br> res = AST_TEST_FAIL;<br> }<br><br> ast_free(expr);<br> ast_free(result);<br><br> return res;<br></pre></blockquote></p><p><blockquote style="border-left: 1px solid #aaa; margin: 10px 0; padding: 0 10px;">I thought it would be more helpful to see which ones are failing/succeeding if something goes wrong, […]</blockquote></p><p style="white-space: pre-wrap; word-wrap: break-word;">I could see either way really depending on the test. It's fine how it is if you want to leave it.</p></li></ul></li><li style="margin: 0; padding: 0;"><p><a href="null">File main/pbx_builtins.c:</a></p><ul style="list-style: none; padding: 0;"><li style="margin: 0; padding: 0 0 0 16px;"><p style="margin-bottom: 4px;"><a href="https://gerrit.asterisk.org/c/asterisk/+/16226/comment/677c3800_9ab18ada">Patch Set #13, Line 1397:</a> </p><p><blockquote style="border-left: 1px solid #aaa; margin: 10px 0; padding: 0 10px;"><pre style="font-family: monospace,monospace; white-space: pre-wrap;"> if (sscanf(tmp, "%d", &number_val) != 1) {<br> ast_log(LOG_WARNING, "argument '%s' to SayOrdinal could not be parsed as a number.\n", tmp);<br> return 0;<br> }<br></pre></blockquote></p><p style="white-space: pre-wrap; word-wrap: break-word;">Looks like this one got missed. Use the ast_str_to_int here too.</p></li></ul></li><li style="margin: 0; padding: 0;"><p><a href="null">File main/say.c:</a></p><ul style="list-style: none; padding: 0;"><li style="margin: 0; padding: 0 0 0 16px;"><p style="margin-bottom: 4px;"><a href="https://gerrit.asterisk.org/c/asterisk/+/16226/comment/9efeb010_033b69df">Patch Set #12, Line 385:</a> <code style="font-family:monospace,monospace">fnrecurse = ast_get_number_str((amt / 100), lang);</code></p><p><blockquote style="border-left: 1px solid #aaa; margin: 10px 0; padding: 0 10px;">Done</blockquote></p><p style="white-space: pre-wrap; word-wrap: break-word;">This appears to still be a problem</p></li><li style="margin: 0; padding: 0 0 0 16px;"><p style="margin-bottom: 4px;"><a href="https://gerrit.asterisk.org/c/asterisk/+/16226/comment/fd4e518c_cdc5a292">Patch Set #12, Line 597:</a> </p><p><blockquote style="border-left: 1px solid #aaa; margin: 10px 0; padding: 0 10px;"><pre style="font-family: monospace,monospace; white-space: pre-wrap;"> fnrecurse = get_number_str_en((num / 1000), lang);<br> fnr = ast_str_buffer(fnrecurse);<br> ast_str_append(&filenames, 0, (loops == 0 ? "%s" : "&%s"), fnr);<br> num %= 1000;<br> snprintf(fn, sizeof(fn), (num % 1000 == 0) ? "&digits/h-thousand" : "&digits/thousand");<br> } else {<br> if (num < 1000000000) { /* 1,000,000,000 */<br> fnrecurse = get_number_str_en((num / 1000000), lang);<br> fnr = ast_str_buffer(fnrecurse);<br> ast_str_append(&filenames, 0, (loops == 0 ? "%s" : "&%s"), fnr);<br> num %= 1000000;<br> ast_copy_string(fn, (num % 1000000 == 0) ? "&digits/h-million" : "&digits/million", sizeof(fn));<br> } else {<br> if (num < INT_MAX) {<br> fnrecurse = get_number_str_en((num / 1000000000), lang);<br> fnr = ast_str_buffer(fnrecurse);<br> ast_str_append(&filenames, 0, (loops == 0 ? "%s" : "&%s"), fnr);<br> num %= 1000000000;<br> ast_copy_string(fn, (num % 1000000000 == 0) ? "&digits/h-billion" : "&digits/billion", <br></pre></blockquote></p><p><blockquote style="border-left: 1px solid #aaa; margin: 10px 0; padding: 0 10px;">Done</blockquote></p><p style="white-space: pre-wrap; word-wrap: break-word;">Still need to check if fnrecurse is NULL after retrieving.</p></li><li style="margin: 0; padding: 0 0 0 16px;"><p style="margin-bottom: 4px;"><a href="https://gerrit.asterisk.org/c/asterisk/+/16226/comment/627cceb1_7b14a69b">Patch Set #12, Line 563:</a> </p><p><blockquote style="border-left: 1px solid #aaa; margin: 10px 0; padding: 0 10px;"><pre style="font-family: monospace,monospace; white-space: pre-wrap;"> while (!res && (num || playh)) {<br> if (num < 0) {<br> ast_copy_string(fn, "digits/minus", sizeof(fn));<br> if ( num > INT_MIN ) {<br> num = -num;<br> } else {<br> num = 0;<br> }<br> } else if (playh) {<br> ast_copy_string(fn, (num % 100 == 0) ? "digits/h-hundred" : "digits/hundred", sizeof(fn));<br> playh = 0;<br> } else if (num < 20) {<br> if (num > 0) {<br> snprintf(fn, sizeof(fn), "digits/h-%d", num);<br> } else {<br> ast_log(LOG_ERROR, "Unsupported ordinal number: %d\n", num);<br> }<br> num = 0;<br> } else if (num < 100) {<br> int base = (num / 10) * 10;<br> if (base != num) {<br> snprintf(fn, sizeof(fn), "digits/%d", base);<br> } else {<br> snprintf(fn, sizeof(fn), "digits/h-%d", base);<br> }<br> num %= 10;<br> } else {<br> if (num < 1000){<br> snprintf(fn, sizeof(fn), "digits/%d", (num/100));<br> playh++;<br> num %= 100;<br> } else {<br> struct ast_str *fnrecurse;<br> if (num < 1000000) { /* 1,000,000 */<br> fnrecurse = get_number_str_en((num / 1000), lang);<br> fnr = ast_str_buffer(fnrecurse);<br> ast_str_append(&filenames, 0, (loops == 0 ? "%s" : "&%s"), fnr);<br> num %= 1000;<br> snprintf(fn, sizeof(fn), (num % 1000 == 0) ? "&digits/h-thousand" : "&digits/thousand");<br> } else {<br> if (num < 1000000000) { /* 1,000,000,000 */<br> fnrecurse = get_number_str_en((num / 1000000), lang);<br> fnr = ast_str_buffer(fnrecurse);<br> ast_str_append(&filenames, 0, (loops == 0 ? "%s" : "&%s"), fnr);<br> num %= 1000000;<br> ast_copy_string(fn, (num % 1000000 == 0) ? "&digits/h-million" : "&digits/million", sizeof(fn));<br> } else {<br> if (num < INT_MAX) {<br> fnrecurse = get_number_str_en((num / 1000000000), lang);<br> fnr = ast_str_buffer(fnrecurse);<br> ast_str_append(&filenames, 0, (loops == 0 ? "%s" : "&%s"), fnr);<br> num %= 1000000000;<br> ast_copy_string(fn, (num % 1000000000 == 0) ? "&digits/h-billion" : "&digits/billion", sizeof(fn));<br> } else {<br> ast_log(LOG_WARNING, "Number '%d' is too big for me\n", num);<br> res = -1;<br> }<br> }<br> }<br> /* we already decided whether or not to add an &, don't add another one immediately */<br> loops = 0;<br> }<br> }<br> if (!res) {<br> ast_str_append(&filenames, 0, (loops == 0 ? "%s" : "&%s"), fn);<br> loops++;<br> }<br></pre></blockquote></p><p><blockquote style="border-left: 1px solid #aaa; margin: 10px 0; padding: 0 10px;">I tried doing this but ran into crashes and core dumps with memory issues that didn't really make se […]</blockquote></p><p style="white-space: pre-wrap; word-wrap: break-word;">Ah yeah it's fine then as is if causing a problem.</p></li></ul></li></ul><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/16226">change 16226</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/16226"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: If9718c89353b8e153d84add3cc4637b79585db19 </div>
<div style="display:none"> Gerrit-Change-Number: 16226 </div>
<div style="display:none"> Gerrit-PatchSet: 13 </div>
<div style="display:none"> Gerrit-Owner: N A <mail@interlinked.x10host.com> </div>
<div style="display:none"> Gerrit-Reviewer: Friendly Automation </div>
<div style="display:none"> Gerrit-Reviewer: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Kevin Harwell <kharwell@digium.com> </div>
<div style="display:none"> Gerrit-CC: Joshua Colp <jcolp@sangoma.com> </div>
<div style="display:none"> Gerrit-Attention: N A <mail@interlinked.x10host.com> </div>
<div style="display:none"> Gerrit-Attention: Joshua Colp <jcolp@sangoma.com> </div>
<div style="display:none"> Gerrit-Attention: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-Comment-Date: Fri, 20 Aug 2021 21:47:59 +0000 </div>
<div style="display:none"> Gerrit-HasComments: Yes </div>
<div style="display:none"> Gerrit-Has-Labels: Yes </div>
<div style="display:none"> Comment-In-Reply-To: N A <mail@interlinked.x10host.com> </div>
<div style="display:none"> Comment-In-Reply-To: Kevin Harwell <kharwell@digium.com> </div>
<div style="display:none"> Gerrit-MessageType: comment </div>