support to unsigned short and variable-length argument

Fork of mbed-rpc by mbed official

Committer:
va009039
Date:
Fri Feb 15 13:35:22 2013 +0000
Revision:
1:96ac4b2bbd64
Parent:
0:efe8172b4113
support to unsigned short and variable-length argument

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 1:96ac4b2bbd64 1 /* mbed Microcontroller Library
va009039 1:96ac4b2bbd64 2 * Copyright (c) 2006-2012 ARM Limited
va009039 1:96ac4b2bbd64 3 *
va009039 1:96ac4b2bbd64 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
va009039 1:96ac4b2bbd64 5 * of this software and associated documentation files (the "Software"), to deal
va009039 1:96ac4b2bbd64 6 * in the Software without restriction, including without limitation the rights
va009039 1:96ac4b2bbd64 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
va009039 1:96ac4b2bbd64 8 * copies of the Software, and to permit persons to whom the Software is
va009039 1:96ac4b2bbd64 9 * furnished to do so, subject to the following conditions:
va009039 1:96ac4b2bbd64 10 *
va009039 1:96ac4b2bbd64 11 * The above copyright notice and this permission notice shall be included in
va009039 1:96ac4b2bbd64 12 * all copies or substantial portions of the Software.
va009039 1:96ac4b2bbd64 13 *
va009039 1:96ac4b2bbd64 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
va009039 1:96ac4b2bbd64 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
va009039 1:96ac4b2bbd64 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
va009039 1:96ac4b2bbd64 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
va009039 1:96ac4b2bbd64 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
va009039 1:96ac4b2bbd64 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
va009039 1:96ac4b2bbd64 20 * SOFTWARE.
va009039 1:96ac4b2bbd64 21 */
va009039 1:96ac4b2bbd64 22 #include "Arguments.h"
va009039 1:96ac4b2bbd64 23 #include "pinmap.h"
va009039 1:96ac4b2bbd64 24
va009039 1:96ac4b2bbd64 25 using namespace std;
va009039 1:96ac4b2bbd64 26
va009039 1:96ac4b2bbd64 27 namespace mbed {
va009039 1:96ac4b2bbd64 28
va009039 1:96ac4b2bbd64 29 Arguments::Arguments(const char* rqs) {
va009039 1:96ac4b2bbd64 30 obj_name = NULL;
va009039 1:96ac4b2bbd64 31 method_name = NULL;
va009039 1:96ac4b2bbd64 32 argc = 0;
va009039 1:96ac4b2bbd64 33
va009039 1:96ac4b2bbd64 34 // This copy can be removed if we can assume the request string is
va009039 1:96ac4b2bbd64 35 // persistent and writable for the duration of the call
va009039 1:96ac4b2bbd64 36 strcpy(request, rqs);
va009039 1:96ac4b2bbd64 37
va009039 1:96ac4b2bbd64 38 // Initial '/'
va009039 1:96ac4b2bbd64 39 char* p = request;
va009039 1:96ac4b2bbd64 40 if (*p != '/') return;
va009039 1:96ac4b2bbd64 41 p++;
va009039 1:96ac4b2bbd64 42
va009039 1:96ac4b2bbd64 43 // Object Name
va009039 1:96ac4b2bbd64 44 p = search_arg(&obj_name, p, '/');
va009039 1:96ac4b2bbd64 45 if (p == NULL) return;
va009039 1:96ac4b2bbd64 46
va009039 1:96ac4b2bbd64 47 // Method Name
va009039 1:96ac4b2bbd64 48 p = search_arg(&method_name, p, ' ');
va009039 1:96ac4b2bbd64 49 if (p == NULL) return;
va009039 1:96ac4b2bbd64 50
va009039 1:96ac4b2bbd64 51 // Arguments
va009039 1:96ac4b2bbd64 52 while (true) {
va009039 1:96ac4b2bbd64 53 argv[argc] = NULL;
va009039 1:96ac4b2bbd64 54 p = search_arg(&argv[argc], p, ' ');
va009039 1:96ac4b2bbd64 55 if (argv[argc] != NULL) argc++;
va009039 1:96ac4b2bbd64 56 if (p == NULL) break;
va009039 1:96ac4b2bbd64 57 }
va009039 1:96ac4b2bbd64 58
va009039 1:96ac4b2bbd64 59 index = -1;
va009039 1:96ac4b2bbd64 60 }
va009039 1:96ac4b2bbd64 61
va009039 1:96ac4b2bbd64 62 char* Arguments::search_arg(char **arg, char *p, char next_sep) {
va009039 1:96ac4b2bbd64 63 char *s = p;
va009039 1:96ac4b2bbd64 64 while (true) {
va009039 1:96ac4b2bbd64 65 if ((*p == '/') || (*p == ' ') || (*p == '\n') || (*p == '\0')) break;
va009039 1:96ac4b2bbd64 66 p++;
va009039 1:96ac4b2bbd64 67 }
va009039 1:96ac4b2bbd64 68 if (p == s) return NULL;
va009039 1:96ac4b2bbd64 69 *arg = s;
va009039 1:96ac4b2bbd64 70 char separator = *p;
va009039 1:96ac4b2bbd64 71 *p = '\0';
va009039 1:96ac4b2bbd64 72 p++;
va009039 1:96ac4b2bbd64 73 return (separator == next_sep) ? (p) : (NULL);
va009039 1:96ac4b2bbd64 74 }
va009039 1:96ac4b2bbd64 75
va009039 1:96ac4b2bbd64 76 template<> PinName Arguments::getArg<PinName>(void) {
va009039 1:96ac4b2bbd64 77 index++;
va009039 1:96ac4b2bbd64 78 return parse_pins(argv[index]);
va009039 1:96ac4b2bbd64 79 }
va009039 1:96ac4b2bbd64 80
va009039 1:96ac4b2bbd64 81 template<> int Arguments::getArg<int>(void) {
va009039 1:96ac4b2bbd64 82 index++;
va009039 1:96ac4b2bbd64 83 char *pEnd;
va009039 1:96ac4b2bbd64 84 return strtol(argv[index], &pEnd, 10);
va009039 1:96ac4b2bbd64 85 }
va009039 1:96ac4b2bbd64 86
va009039 1:96ac4b2bbd64 87 template<> unsigned short Arguments::getArg<unsigned short>(void) {
va009039 1:96ac4b2bbd64 88 index++;
va009039 1:96ac4b2bbd64 89 char *pEnd;
va009039 1:96ac4b2bbd64 90 return strtol(argv[index], &pEnd, 10);
va009039 1:96ac4b2bbd64 91 }
va009039 1:96ac4b2bbd64 92
va009039 1:96ac4b2bbd64 93 template<> const char* Arguments::getArg<const char*>(void) {
va009039 1:96ac4b2bbd64 94 index++;
va009039 1:96ac4b2bbd64 95 return argv[index];
va009039 1:96ac4b2bbd64 96 }
va009039 1:96ac4b2bbd64 97
va009039 1:96ac4b2bbd64 98 template<> char Arguments::getArg<char>(void) {
va009039 1:96ac4b2bbd64 99 index++;
va009039 1:96ac4b2bbd64 100 return *argv[index];
va009039 1:96ac4b2bbd64 101 }
va009039 1:96ac4b2bbd64 102
va009039 1:96ac4b2bbd64 103 template<> double Arguments::getArg<double>(void) {
va009039 1:96ac4b2bbd64 104 index++;
va009039 1:96ac4b2bbd64 105 return atof(argv[index]);
va009039 1:96ac4b2bbd64 106 }
va009039 1:96ac4b2bbd64 107
va009039 1:96ac4b2bbd64 108 template<> float Arguments::getArg<float>(void) {
va009039 1:96ac4b2bbd64 109 index++;
va009039 1:96ac4b2bbd64 110 return atof(argv[index]);
va009039 1:96ac4b2bbd64 111 }
va009039 1:96ac4b2bbd64 112
va009039 1:96ac4b2bbd64 113 Reply::Reply(char* r) {
va009039 1:96ac4b2bbd64 114 first = true;
va009039 1:96ac4b2bbd64 115 *r = '\0';
va009039 1:96ac4b2bbd64 116 reply = r;
va009039 1:96ac4b2bbd64 117 }
va009039 1:96ac4b2bbd64 118
va009039 1:96ac4b2bbd64 119 void Reply::separator(void) {
va009039 1:96ac4b2bbd64 120 if (first) {
va009039 1:96ac4b2bbd64 121 first = false;
va009039 1:96ac4b2bbd64 122 } else {
va009039 1:96ac4b2bbd64 123 *reply = ' '; reply++;
va009039 1:96ac4b2bbd64 124 }
va009039 1:96ac4b2bbd64 125 }
va009039 1:96ac4b2bbd64 126
va009039 1:96ac4b2bbd64 127 template<> void Reply::putData<const char*>(const char* s) {
va009039 1:96ac4b2bbd64 128 separator();
va009039 1:96ac4b2bbd64 129 reply += sprintf(reply, "%s", s);
va009039 1:96ac4b2bbd64 130 }
va009039 1:96ac4b2bbd64 131
va009039 1:96ac4b2bbd64 132 template<> void Reply::putData<char*>(char* s) {
va009039 1:96ac4b2bbd64 133 separator();
va009039 1:96ac4b2bbd64 134 reply += sprintf(reply, "%s", s);
va009039 1:96ac4b2bbd64 135 }
va009039 1:96ac4b2bbd64 136
va009039 1:96ac4b2bbd64 137 template<> void Reply::putData<char>(char c) {
va009039 1:96ac4b2bbd64 138 separator();
va009039 1:96ac4b2bbd64 139 reply += sprintf(reply, "%c", c);
va009039 1:96ac4b2bbd64 140 }
va009039 1:96ac4b2bbd64 141
va009039 1:96ac4b2bbd64 142 template<> void Reply::putData<int>(int v) {
va009039 1:96ac4b2bbd64 143 separator();
va009039 1:96ac4b2bbd64 144 reply += sprintf(reply, "%d", v);
va009039 1:96ac4b2bbd64 145 }
va009039 1:96ac4b2bbd64 146
va009039 1:96ac4b2bbd64 147 template<> void Reply::putData<unsigned short>(unsigned short v) {
va009039 1:96ac4b2bbd64 148 separator();
va009039 1:96ac4b2bbd64 149 reply += sprintf(reply, "%u", v);
va009039 1:96ac4b2bbd64 150 }
va009039 1:96ac4b2bbd64 151
va009039 1:96ac4b2bbd64 152 template<> void Reply::putData<float>(float f) {
va009039 1:96ac4b2bbd64 153 separator();
va009039 1:96ac4b2bbd64 154 reply += sprintf(reply, "%.17g", f);
va009039 1:96ac4b2bbd64 155 }
va009039 1:96ac4b2bbd64 156
va009039 1:96ac4b2bbd64 157 } // namespace mbed