wsstdlib.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:8k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  *
  3.  * wsstdlib.c
  4.  *
  5.  * Author: Markku Rossi <mtr@iki.fi>
  6.  *
  7.  * Copyright (c) 1999-2000 WAPIT OY LTD.
  8.  *  All rights reserved.
  9.  *
  10.  * Standard libraries.
  11.  *
  12.  */
  13. #include "wsint.h"
  14. /* TODO: the function registry could have argument type specifier
  15.  * strings.  These could be used to generate extra warnings when
  16.  * functions are called with wrong arguments.  However, this might not
  17.  * be fully conformable to the WMLScript specification.  I think that
  18.  * the interpreter might do an automatic type conversion so the
  19.  * warnings are less useful.  But, these warnings could be enabled in
  20.  * the `-Wpedantic' mode. */
  21. /********************* Types and definitions ****************************/
  22. /* Calculate the number of function registries in the array `f'. */
  23. #define NF(f) (sizeof(f) / sizeof(f[0]))
  24. /* Information about a standard library function. */
  25. struct WsStdLibFuncRegRec
  26. {
  27.     char *name;
  28.     /* The exact number of arguments. */
  29.     int num_args;
  30.     WsUInt8 function_id;
  31. };
  32. typedef struct WsStdLibFuncRegRec WsStdLibFuncReg;
  33. /* Information about a standard library. */
  34. struct WsStdLibRegRec
  35. {
  36.     char *name;
  37.     WsUInt16 library_id;
  38.     /* The number of functions in this library. */
  39.     WsUInt8 num_functions;
  40.     /* The functions are given in their index order. */
  41.     WsStdLibFuncReg *functions;
  42. };
  43. typedef struct WsStdLibRegRec WsStdLibReg;
  44. /********************* Static variables *********************************/
  45. static WsStdLibFuncReg lib_lang_functions[] =
  46.     {
  47.         {"abs", 1, 0},
  48.         {"min", 2, 1},
  49.         {"max", 2, 2},
  50.         {"parseInt", 1, 3},
  51.         {"parseFloat", 1, 4},
  52.         {"isInt", 1, 5},
  53.         {"isFloat", 1, 6},
  54.         {"maxInt", 0, 7},
  55.         {"minInt", 0, 8},
  56.         {"float", 0, 9},
  57.         {"exit", 1, 10},
  58.         {"abort", 1, 11},
  59.         {"random", 1, 12},
  60.         {"seed", 1, 13},
  61.         {"characterSet", 0, 14},
  62.     };
  63. static WsStdLibFuncReg lib_float_functions[] =
  64.     {
  65.         {"int", 1, 0},
  66.         {"floor", 1, 1},
  67.         {"ceil", 1, 2},
  68.         {"pow", 2, 3},
  69.         {"round", 1, 4},
  70.         {"sqrt", 1, 5},
  71.         {"maxFloat", 0, 6},
  72.         {"minFloat", 0, 7},
  73.     };
  74. static WsStdLibFuncReg lib_string_functions[] =
  75.     {
  76.         {"length", 1, 0},
  77.         {"isEmpty", 1, 1},
  78.         {"charAt", 2, 2},
  79.         {"subString", 3, 3},
  80.         {"find", 2, 4},
  81.         {"replace", 3, 5},
  82.         {"elements", 2, 6},
  83.         {"elementAt", 3, 7},
  84.         {"removeAt", 3, 8},
  85.         {"replaceAt", 4, 9},
  86.         {"insertAt", 4, 10},
  87.         {"squeeze", 1, 11},
  88.         {"trim", 1, 12},
  89.         {"compare", 2, 13},
  90.         {"toString", 1, 14},
  91.         {"format", 2, 15},
  92.     };
  93. static WsStdLibFuncReg lib_url_functions[] =
  94.     {
  95.         {"isValid", 1, 0},
  96.         {"getScheme", 1, 1},
  97.         {"getHost", 1, 2},
  98.         {"getPort", 1, 3},
  99.         {"getPath", 1, 4},
  100.         {"getParameters", 1, 5},
  101.         {"getQuery", 1, 6},
  102.         {"getFragment", 1, 7},
  103.         {"getBase", 0, 8},
  104.         {"getReferer", 0, 9},
  105.         {"resolve", 2, 10},
  106.         {"escapeString", 1, 11},
  107.         {"unescapeString", 1, 12},
  108.         {"loadString", 2, 13},
  109.     };
  110. static WsStdLibFuncReg lib_wmlbrowser_functions[] =
  111.     {
  112.         {"getVar", 1, 0},
  113.         {"setVar", 2, 1},
  114.         {"go", 1, 2},
  115.         {"prev", 0, 3},
  116.         {"newContext", 0, 4},
  117.         {"getCurrentCard", 0, 5},
  118.         {"refresh", 0, 6},
  119.     };
  120. static WsStdLibFuncReg lib_dialogs_functions[] =
  121.     {
  122.         {"prompt", 2, 0},
  123.         {"confirm", 3, 1},
  124.         {"alert", 1, 2},
  125.     };
  126. static WsStdLibFuncReg lib_wtapublic_functions[] =
  127.     {
  128.         {"makeCall", 1, 0},
  129.         {"sendDTMF", 1, 1},
  130.     };
  131. static WsStdLibFuncReg lib_wtavoicecall_functions[] =
  132.     {
  133.         {"setup", 2, 0},
  134.         {"accept", 2, 1},
  135.         {"release", 1, 2},
  136.         {"sendDTMF", 1, 3},
  137.     };
  138. static WsStdLibFuncReg lib_wtanettext_functions[] =
  139.     {
  140.         {"send", 2, 0},
  141.         {"read", 1, 1},
  142.         {"remove", 1, 2},
  143.         {"getFieldValue", 2, 3},
  144.     };
  145. static WsStdLibFuncReg lib_phonebook_functions[] =
  146.     {
  147.         {"write", 3, 0},
  148.         {"read", 2, 1},
  149.         {"remove", 1, 2},
  150.         {"getFieldValue", 2, 3},
  151.     };
  152. static WsStdLibFuncReg lib_wtacalllog_functions[] =
  153.     {
  154.         {"dialled", 1, 0},
  155.         {"missed", 1, 1},
  156.         {"received", 1, 2},
  157.         {"getFieldValue", 2, 3},
  158.     };
  159. static WsStdLibFuncReg lib_wtamisc_functions[] =
  160.     {
  161.         {"indication", 3, 0},
  162.         {"endcontext", 0, 1},
  163.         {"protected", 1, 2},
  164.     };
  165. static WsStdLibFuncReg lib_wtagsm_functions[] =
  166.     {
  167.         {"reject", 1, 0},
  168.         {"hold", 1, 1},
  169.         {"transfer", 1, 2},
  170.         {"multiparty", 0, 3},
  171.         {"retrieve", 1, 4},
  172.         {"location", 0, 5},
  173.         {"sendUSSD", 4, 6},
  174.     };
  175. static WsStdLibFuncReg lib_crypto_functions[] =
  176.     {
  177.         {"signText", 4, 16},
  178.     };
  179. static WsStdLibReg libraries[] =
  180.     {
  181.         {"Lang", 0, NF(lib_lang_functions), lib_lang_functions},
  182.         {"Float", 1, NF(lib_float_functions), lib_float_functions},
  183.         {"String", 2, NF(lib_string_functions), lib_string_functions},
  184.         {"URL", 3, NF(lib_url_functions), lib_url_functions},
  185.         {"WMLBrowser", 4, NF(lib_wmlbrowser_functions),
  186.          lib_wmlbrowser_functions},
  187.         {"Dialogs", 5, NF(lib_dialogs_functions), lib_dialogs_functions},
  188.         {"Crypto", 6, NF(lib_crypto_functions), lib_crypto_functions},
  189.         {"WTAPublic", 512, NF(lib_wtapublic_functions), lib_wtapublic_functions},
  190.         {"WTAVoiceCall", 513, NF(lib_wtavoicecall_functions), lib_wtavoicecall_functions},
  191.         {"WTANetText", 514, NF(lib_wtanettext_functions), lib_wtanettext_functions},
  192.         {"PhoneBook", 515, NF(lib_phonebook_functions), lib_phonebook_functions},
  193.         {"WTAMisc", 516, NF(lib_wtamisc_functions), lib_wtamisc_functions},
  194.         {"WTAGSM", 518, NF(lib_wtagsm_functions), lib_wtagsm_functions},
  195.         {"WTACallLog", 519, NF(lib_wtacalllog_functions), lib_wtacalllog_functions},
  196.         {NULL, 0, 0, NULL}
  197.     };
  198. /********************* Global functions *********************************/
  199. WsBool ws_stdlib_function(const char *library, const char *function,
  200.                           WsUInt16 *lindex_return, WsUInt8 *findex_return,
  201.                           WsUInt8 *num_args_return, WsBool *lindex_found_return,
  202.                           WsBool *findex_found_return)
  203. {
  204.     WsUInt16 l;
  205.     *lindex_found_return = WS_FALSE;
  206.     *findex_found_return = WS_FALSE;
  207.     for (l = 0; libraries[l].name != NULL; l++) {
  208.         if (strcmp(libraries[l].name, library) == 0) {
  209.             WsUInt8 f;
  210.             *lindex_return = libraries[l].library_id;
  211.             *lindex_found_return = WS_TRUE;
  212.             for (f = 0; f < libraries[l].num_functions; f++) {
  213.                 if (strcmp(libraries[l].functions[f].name, function) == 0) {
  214.                     *findex_return = libraries[l].functions[f].function_id;
  215.                     *findex_found_return = WS_TRUE;
  216.                     *num_args_return = libraries[l].functions[f].num_args;
  217.                     return WS_TRUE;
  218.                 }
  219.     }
  220.         }
  221.     }
  222.     return WS_FALSE;
  223. }
  224. WsBool ws_stdlib_function_name(WsUInt16 lindex, WsUInt8 findex,
  225.                                const char **library_return,
  226.                                const char **function_return)
  227. {
  228.     WsUInt16 l;
  229.     WsUInt8 f;
  230.     *library_return = NULL;
  231.     *function_return = NULL;
  232.     for (l = 0; libraries[l].name != NULL; l++)
  233.         if (libraries[l].library_id == lindex)
  234.             for (f = 0; f < libraries[l].num_functions; f++) {
  235.                 if (libraries[l].functions[f].function_id == findex) {
  236.                     *library_return = libraries[l].name;
  237.                     *function_return = libraries[l].functions[f].name;
  238.                     return WS_TRUE;
  239.                 }
  240.             }
  241.     return WS_FALSE;
  242. }