Funzioni di IO varie con seriale asincrona
Dependents: Nucleo_AsyncSerialIO
Fork of IOFuncLib by
IOFuncLib.cpp@20:46de8943071a, 2015-12-27 (annotated)
- Committer:
- MaxScorda
- Date:
- Sun Dec 27 23:15:16 2015 +0000
- Revision:
- 20:46de8943071a
- Parent:
- 19:93274a65f664
Min var
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MaxScorda | 2:8e723d99838e | 1 | #include "config.h" |
MaxScorda | 0:f401aa69861a | 2 | #include "IOFuncLib.h" |
MaxScorda | 12:0df187b0bfad | 3 | #include "BufferedSerial.h" |
MaxScorda | 17:9a7f30cb244d | 4 | |
MaxScorda | 0:f401aa69861a | 5 | #include "mbed.h" |
MaxScorda | 0:f401aa69861a | 6 | |
MaxScorda | 1:58f3784ad68e | 7 | // FLASHER |
MaxScorda | 0:f401aa69861a | 8 | Flasher::Flasher(PinName pin) : _pin(pin) |
MaxScorda | 0:f401aa69861a | 9 | { |
MaxScorda | 16:e2a2e0dd6c1b | 10 | _pin = 0; |
MaxScorda | 0:f401aa69861a | 11 | } |
MaxScorda | 0:f401aa69861a | 12 | |
MaxScorda | 0:f401aa69861a | 13 | void Flasher::flash(int n) |
MaxScorda | 0:f401aa69861a | 14 | { |
MaxScorda | 0:f401aa69861a | 15 | for(int i=0; i<n*2; i++) { |
MaxScorda | 0:f401aa69861a | 16 | _pin = !_pin; |
MaxScorda | 15:a97e5d4fe3d9 | 17 | wait(0.05f); |
MaxScorda | 18:149091052948 | 18 | // wait_ms(50); |
MaxScorda | 0:f401aa69861a | 19 | } |
MaxScorda | 0:f401aa69861a | 20 | } |
MaxScorda | 0:f401aa69861a | 21 | |
MaxScorda | 0:f401aa69861a | 22 | void Flasher::onOff(bool n) |
MaxScorda | 0:f401aa69861a | 23 | { |
MaxScorda | 0:f401aa69861a | 24 | _pin=n; |
MaxScorda | 0:f401aa69861a | 25 | } |
MaxScorda | 0:f401aa69861a | 26 | |
MaxScorda | 16:e2a2e0dd6c1b | 27 | void Flasher::notPin(void) |
MaxScorda | 0:f401aa69861a | 28 | { |
MaxScorda | 0:f401aa69861a | 29 | _pin = !_pin; |
MaxScorda | 1:58f3784ad68e | 30 | } |
MaxScorda | 1:58f3784ad68e | 31 | |
MaxScorda | 12:0df187b0bfad | 32 | |
MaxScorda | 12:0df187b0bfad | 33 | |
MaxScorda | 1:58f3784ad68e | 34 | // Screen |
MaxScorda | 13:7871bb60d370 | 35 | Screen::Screen(BufferedSerial* ps) |
MaxScorda | 1:58f3784ad68e | 36 | { |
MaxScorda | 1:58f3784ad68e | 37 | _ps=ps; |
MaxScorda | 1:58f3784ad68e | 38 | } |
MaxScorda | 1:58f3784ad68e | 39 | |
MaxScorda | 1:58f3784ad68e | 40 | void Screen::banner() |
MaxScorda | 1:58f3784ad68e | 41 | { |
MaxScorda | 4:eae942db86db | 42 | genFunctions fA; |
MaxScorda | 4:eae942db86db | 43 | writeScreen("_____ Boot screen _____\n",25,1); |
MaxScorda | 4:eae942db86db | 44 | writeScreen("___ Nucleo Scorda IO Test ___\n",22,2); |
MaxScorda | 4:eae942db86db | 45 | writeScreen(fA.string2char(fA.padstr("-\n",78,'-')),1,5); //azzo funziona... |
MaxScorda | 4:eae942db86db | 46 | writeScreen("Parsing \n",2,5); |
MaxScorda | 4:eae942db86db | 47 | writeScreen("Funzione\n",2,7); |
MaxScorda | 4:eae942db86db | 48 | writeScreen("Numero\n",22,7); |
MaxScorda | 4:eae942db86db | 49 | writeScreen("Parametro\n",42,7); |
MaxScorda | 14:69aa07aec21f | 50 | writeScreen(fA.string2char(fA.padstr("-\n",78,'-')),1,10); //azzo funziona... |
MaxScorda | 14:69aa07aec21f | 51 | writeScreen("Status \n",2,10); |
MaxScorda | 14:69aa07aec21f | 52 | writeScreen("Led 1 \n",2,12); |
MaxScorda | 14:69aa07aec21f | 53 | writeScreen("Virtual Led \n",22,12); |
MaxScorda | 14:69aa07aec21f | 54 | writeScreen("Other Commands \n",42,12); |
MaxScorda | 14:69aa07aec21f | 55 | writeScreen("Real Out Serial\n",62,12); |
MaxScorda | 14:69aa07aec21f | 56 | writeScreen("Input string\n",2,15); |
MaxScorda | 14:69aa07aec21f | 57 | writeScreen("Result\n",42,15); |
MaxScorda | 14:69aa07aec21f | 58 | writeScreen(fA.string2char(fA.padstr("-\n",78,'-')),1,18); //azzo funziona... |
MaxScorda | 14:69aa07aec21f | 59 | writeScreen("Serial Input \n",2,18); |
MaxScorda | 2:8e723d99838e | 60 | commitScreen(); |
MaxScorda | 1:58f3784ad68e | 61 | } |
MaxScorda | 1:58f3784ad68e | 62 | |
MaxScorda | 1:58f3784ad68e | 63 | void Screen::pressed() |
MaxScorda | 1:58f3784ad68e | 64 | { |
MaxScorda | 2:8e723d99838e | 65 | //_ps->printf("\f"); |
MaxScorda | 2:8e723d99838e | 66 | // _ps->printf("*** Reset Screen ***\n\r\n"); |
MaxScorda | 2:8e723d99838e | 67 | writeScreen("*** Reset Screen ***\n",1,1); |
MaxScorda | 2:8e723d99838e | 68 | commitScreen(); |
MaxScorda | 2:8e723d99838e | 69 | } |
MaxScorda | 2:8e723d99838e | 70 | |
MaxScorda | 2:8e723d99838e | 71 | void Screen::commitScreen() |
MaxScorda | 2:8e723d99838e | 72 | { |
MaxScorda | 1:58f3784ad68e | 73 | _ps->printf("\f"); |
MaxScorda | 2:8e723d99838e | 74 | for (int j = 0; j < screenRow-2; j++) { |
MaxScorda | 2:8e723d99838e | 75 | for (int i = 0; i < screenColumn; i++) { |
MaxScorda | 2:8e723d99838e | 76 | _ps->printf("%c",svec[i][j]); |
MaxScorda | 2:8e723d99838e | 77 | } |
MaxScorda | 2:8e723d99838e | 78 | _ps->printf("\n\r"); |
MaxScorda | 2:8e723d99838e | 79 | } |
MaxScorda | 2:8e723d99838e | 80 | } |
MaxScorda | 2:8e723d99838e | 81 | |
MaxScorda | 4:eae942db86db | 82 | void Screen::writeScreen(char sstr[], char xx, char yy, int padb) |
MaxScorda | 2:8e723d99838e | 83 | { |
MaxScorda | 2:8e723d99838e | 84 | char i=0; |
MaxScorda | 3:6c6446382bb2 | 85 | while ((sstr[i]!='\n') && (i<(screenColumn-xx+1))) { |
MaxScorda | 2:8e723d99838e | 86 | // _ps->printf((char*) sstr[i]); |
MaxScorda | 2:8e723d99838e | 87 | svec[xx+i][yy]=sstr[i]; |
MaxScorda | 2:8e723d99838e | 88 | i++; |
MaxScorda | 2:8e723d99838e | 89 | } |
MaxScorda | 4:eae942db86db | 90 | //prosegui col pad |
MaxScorda | 4:eae942db86db | 91 | while ((padb>0) && (i<(screenColumn-xx-1))) { |
MaxScorda | 4:eae942db86db | 92 | svec[xx+i][yy]=' '; |
MaxScorda | 4:eae942db86db | 93 | i++; |
MaxScorda | 4:eae942db86db | 94 | padb--; |
MaxScorda | 4:eae942db86db | 95 | } |
MaxScorda | 2:8e723d99838e | 96 | |
MaxScorda | 1:58f3784ad68e | 97 | } |
MaxScorda | 2:8e723d99838e | 98 | |
MaxScorda | 2:8e723d99838e | 99 | void Screen::emptyFrame() |
MaxScorda | 2:8e723d99838e | 100 | { |
MaxScorda | 2:8e723d99838e | 101 | char car; |
MaxScorda | 2:8e723d99838e | 102 | for (int j = 0; j < screenRow-2; j++) { |
MaxScorda | 2:8e723d99838e | 103 | if ((j==0) || (j==screenRow-3)) car='-'; |
MaxScorda | 2:8e723d99838e | 104 | else car=' '; |
MaxScorda | 2:8e723d99838e | 105 | for (int i = 1; i < screenColumn-1; i++) { |
MaxScorda | 2:8e723d99838e | 106 | svec[i][j]=car; |
MaxScorda | 2:8e723d99838e | 107 | } |
MaxScorda | 2:8e723d99838e | 108 | svec[0][j]='|'; |
MaxScorda | 2:8e723d99838e | 109 | svec[screenColumn-1][j]='|'; |
MaxScorda | 2:8e723d99838e | 110 | } |
MaxScorda | 2:8e723d99838e | 111 | } |
MaxScorda | 2:8e723d99838e | 112 | |
MaxScorda | 2:8e723d99838e | 113 | void Screen::clearScreen(char upperx, char uppery, char loverx, char lowery) |
MaxScorda | 2:8e723d99838e | 114 | { |
MaxScorda | 2:8e723d99838e | 115 | //controllare margini |
MaxScorda | 2:8e723d99838e | 116 | for (int j = uppery; j <= lowery; j++) { |
MaxScorda | 2:8e723d99838e | 117 | for (int i = upperx; i <= loverx; i++) { |
MaxScorda | 2:8e723d99838e | 118 | svec[i][j]=' ' ; |
MaxScorda | 2:8e723d99838e | 119 | } |
MaxScorda | 2:8e723d99838e | 120 | } |
MaxScorda | 3:6c6446382bb2 | 121 | } |
MaxScorda | 3:6c6446382bb2 | 122 | |
MaxScorda | 12:0df187b0bfad | 123 | |
MaxScorda | 3:6c6446382bb2 | 124 | // general |
MaxScorda | 3:6c6446382bb2 | 125 | |
MaxScorda | 4:eae942db86db | 126 | char* genFunctions::subchar(char* arr, int begin, int len) |
MaxScorda | 3:6c6446382bb2 | 127 | { |
MaxScorda | 4:eae942db86db | 128 | //non funziona |
MaxScorda | 3:6c6446382bb2 | 129 | char* res = new char[len]; |
MaxScorda | 3:6c6446382bb2 | 130 | for (int i = 0; i < len; i++) |
MaxScorda | 3:6c6446382bb2 | 131 | res[i] = *(arr + begin + i); |
MaxScorda | 3:6c6446382bb2 | 132 | res[len] = 0; |
MaxScorda | 3:6c6446382bb2 | 133 | return res; |
MaxScorda | 3:6c6446382bb2 | 134 | } |
MaxScorda | 3:6c6446382bb2 | 135 | |
MaxScorda | 4:eae942db86db | 136 | string genFunctions::padstr(string sttde, int maxlen, char fillchar) |
MaxScorda | 4:eae942db86db | 137 | { |
MaxScorda | 4:eae942db86db | 138 | bool flagEOS=false; |
MaxScorda | 4:eae942db86db | 139 | string ret=sttde; |
MaxScorda | 4:eae942db86db | 140 | if (ret.size()>0) { |
MaxScorda | 4:eae942db86db | 141 | //se ha EOS lo tolgo |
MaxScorda | 4:eae942db86db | 142 | if (ret.substr(ret.size()-1,1) == EOS) { |
MaxScorda | 4:eae942db86db | 143 | ret=ret.substr(0,ret.size()-1); |
MaxScorda | 4:eae942db86db | 144 | flagEOS=true; |
MaxScorda | 4:eae942db86db | 145 | } |
MaxScorda | 4:eae942db86db | 146 | //pad |
MaxScorda | 4:eae942db86db | 147 | if (maxlen> ret.size()) ret.insert(ret.size(), maxlen - ret.size(), fillchar); |
MaxScorda | 4:eae942db86db | 148 | //se aveva EOS, lo rimetto |
MaxScorda | 4:eae942db86db | 149 | if (flagEOS==true) ret=addEOS(ret); |
MaxScorda | 4:eae942db86db | 150 | } |
MaxScorda | 4:eae942db86db | 151 | return ret; |
MaxScorda | 4:eae942db86db | 152 | } |
MaxScorda | 4:eae942db86db | 153 | |
MaxScorda | 3:6c6446382bb2 | 154 | string genFunctions::addEOS(string sttde) |
MaxScorda | 3:6c6446382bb2 | 155 | { |
MaxScorda | 3:6c6446382bb2 | 156 | string ret=sttde; |
MaxScorda | 3:6c6446382bb2 | 157 | if (sttde.substr(sttde.size()-1,1) != "\n") ret=sttde+"\n"; |
MaxScorda | 3:6c6446382bb2 | 158 | return ret; |
MaxScorda | 3:6c6446382bb2 | 159 | } |
MaxScorda | 3:6c6446382bb2 | 160 | |
MaxScorda | 3:6c6446382bb2 | 161 | string genFunctions::subEOS(string sttde) |
MaxScorda | 3:6c6446382bb2 | 162 | { |
MaxScorda | 3:6c6446382bb2 | 163 | string ret=sttde; |
MaxScorda | 3:6c6446382bb2 | 164 | if (sttde.substr(sttde.size()-1,1) == "\n") ret=sttde.substr(0,sttde.size()-2); |
MaxScorda | 3:6c6446382bb2 | 165 | return ret; |
MaxScorda | 3:6c6446382bb2 | 166 | } |
MaxScorda | 3:6c6446382bb2 | 167 | |
MaxScorda | 3:6c6446382bb2 | 168 | char* genFunctions::string2char(string sttde) |
MaxScorda | 3:6c6446382bb2 | 169 | { |
MaxScorda | 3:6c6446382bb2 | 170 | //ora aggiunge comunque l'EOS. Decidere se parametrizzare |
MaxScorda | 3:6c6446382bb2 | 171 | sttde=addEOS(sttde); |
MaxScorda | 3:6c6446382bb2 | 172 | char *cstr = new char[sttde.length() + 1]; |
MaxScorda | 3:6c6446382bb2 | 173 | strcpy(cstr, sttde.c_str()); |
MaxScorda | 4:eae942db86db | 174 | // delete [] cstr; |
MaxScorda | 3:6c6446382bb2 | 175 | return cstr; |
MaxScorda | 4:eae942db86db | 176 | } |
MaxScorda | 4:eae942db86db | 177 | |
MaxScorda | 17:9a7f30cb244d | 178 | int genFunctions::c2i(char sttde) |
MaxScorda | 17:9a7f30cb244d | 179 | { |
MaxScorda | 18:149091052948 | 180 | // single char to integer |
MaxScorda | 17:9a7f30cb244d | 181 | return sttde-'0';; |
MaxScorda | 17:9a7f30cb244d | 182 | } |
MaxScorda | 17:9a7f30cb244d | 183 | |
MaxScorda | 17:9a7f30cb244d | 184 | string genFunctions::i2s(int number) |
MaxScorda | 17:9a7f30cb244d | 185 | { |
MaxScorda | 18:149091052948 | 186 | // integer to string |
MaxScorda | 17:9a7f30cb244d | 187 | if (number == 0) |
MaxScorda | 17:9a7f30cb244d | 188 | return "0"; |
MaxScorda | 17:9a7f30cb244d | 189 | string temp=""; |
MaxScorda | 17:9a7f30cb244d | 190 | string returnvalue=""; |
MaxScorda | 18:149091052948 | 191 | while (number>0) { |
MaxScorda | 17:9a7f30cb244d | 192 | temp+=number%10+48; |
MaxScorda | 17:9a7f30cb244d | 193 | number/=10; |
MaxScorda | 17:9a7f30cb244d | 194 | } |
MaxScorda | 18:149091052948 | 195 | for (int i=0; i<temp.length(); i++) |
MaxScorda | 17:9a7f30cb244d | 196 | returnvalue+=temp[temp.length()-i-1]; |
MaxScorda | 17:9a7f30cb244d | 197 | return returnvalue; |
MaxScorda | 18:149091052948 | 198 | } |
MaxScorda | 18:149091052948 | 199 | |
MaxScorda | 18:149091052948 | 200 | |
MaxScorda | 18:149091052948 | 201 | |
MaxScorda | 18:149091052948 | 202 | |
MaxScorda | 18:149091052948 | 203 | /* atof: convert string s to double */ |
MaxScorda | 18:149091052948 | 204 | double genFunctions::atof(char s[]) |
MaxScorda | 18:149091052948 | 205 | { |
MaxScorda | 18:149091052948 | 206 | double val, power; |
MaxScorda | 18:149091052948 | 207 | int i, sign; |
MaxScorda | 18:149091052948 | 208 | |
MaxScorda | 18:149091052948 | 209 | |
MaxScorda | 18:149091052948 | 210 | for (i = 0; isspace(s[i]); i++); /* skip white space */ |
MaxScorda | 18:149091052948 | 211 | |
MaxScorda | 18:149091052948 | 212 | sign = (s[i] == '-') ? -1 : 1; |
MaxScorda | 18:149091052948 | 213 | if (s[i] == '+' || s[i] == '-') i++; |
MaxScorda | 18:149091052948 | 214 | for (val = 0.0; isdigit(s[i]); i++) { |
MaxScorda | 18:149091052948 | 215 | val = 10.0 * val + (s[i] - '0'); |
MaxScorda | 17:9a7f30cb244d | 216 | } |
MaxScorda | 18:149091052948 | 217 | if (s[i] == '.') i++; |
MaxScorda | 18:149091052948 | 218 | for (power = 1.0; isdigit(s[i]); i++) { |
MaxScorda | 18:149091052948 | 219 | val = 10.0 * val + (s[i] - '0'); |
MaxScorda | 18:149091052948 | 220 | power *= 10.0; |
MaxScorda | 18:149091052948 | 221 | } |
MaxScorda | 18:149091052948 | 222 | return sign * val / power; |
MaxScorda | 18:149091052948 | 223 | } |
MaxScorda | 18:149091052948 | 224 | |
MaxScorda | 18:149091052948 | 225 | /* itoa: convert n to characters in s */ |
MaxScorda | 18:149091052948 | 226 | void genFunctions::itoa(int n, char s[]) |
MaxScorda | 18:149091052948 | 227 | { |
MaxScorda | 18:149091052948 | 228 | int i, sign; |
MaxScorda | 18:149091052948 | 229 | if ((sign = n) < 0) /* record sign */ |
MaxScorda | 18:149091052948 | 230 | n = -n; /* make n positive */ |
MaxScorda | 18:149091052948 | 231 | i = 0; |
MaxScorda | 18:149091052948 | 232 | do { /* generate digits in reverse order */ |
MaxScorda | 18:149091052948 | 233 | s[i++] = n % 10 + '0'; /* get next digit */ |
MaxScorda | 18:149091052948 | 234 | } while ((n /= 10) > 0); /* delete it */ |
MaxScorda | 18:149091052948 | 235 | if (sign < 0) s[i++] = '-'; |
MaxScorda | 18:149091052948 | 236 | s[i] = '\0'; |
MaxScorda | 18:149091052948 | 237 | reverse(s) ; |
MaxScorda | 18:149091052948 | 238 | } |
MaxScorda | 19:93274a65f664 | 239 | |
MaxScorda | 19:93274a65f664 | 240 | |
MaxScorda | 18:149091052948 | 241 | /* reverse: reverse string s in place */ |
MaxScorda | 18:149091052948 | 242 | void genFunctions::reverse(char s[]) |
MaxScorda | 18:149091052948 | 243 | { |
MaxScorda | 18:149091052948 | 244 | int c, i, j; |
MaxScorda | 18:149091052948 | 245 | for (i = 0, j = strlen(s)-1; i < j; i++, j-- ) { |
MaxScorda | 18:149091052948 | 246 | c = s[i]; |
MaxScorda | 18:149091052948 | 247 | s[i] = s[j]; |
MaxScorda | 18:149091052948 | 248 | s[j] = c; |
MaxScorda | 18:149091052948 | 249 | } |
MaxScorda | 18:149091052948 | 250 | } |
MaxScorda | 18:149091052948 | 251 | |
MaxScorda | 18:149091052948 | 252 | |
MaxScorda | 18:149091052948 | 253 | /* atoi: convert s to integer; version 2 */ |
MaxScorda | 18:149091052948 | 254 | int genFunctions::atoi(char s[]) |
MaxScorda | 18:149091052948 | 255 | { |
MaxScorda | 18:149091052948 | 256 | int i, n, sign; |
MaxScorda | 18:149091052948 | 257 | for (i = 0; isspace(s[i]) ; i++) { |
MaxScorda | 18:149091052948 | 258 | ; /* skip white space */ |
MaxScorda | 18:149091052948 | 259 | } |
MaxScorda | 18:149091052948 | 260 | sign= (s[i] == '-') ? -1 : 1; |
MaxScorda | 18:149091052948 | 261 | if (s[i] == '+' || s[i] == '-') i++; /* skip sign */ |
MaxScorda | 18:149091052948 | 262 | for (n = 0; isdigit(s[i]); i++ ) { |
MaxScorda | 18:149091052948 | 263 | ; |
MaxScorda | 18:149091052948 | 264 | } |
MaxScorda | 18:149091052948 | 265 | n = 10 * n + (s[i] - '0'); |
MaxScorda | 18:149091052948 | 266 | return sign * n; |
MaxScorda | 18:149091052948 | 267 | } |
MaxScorda | 17:9a7f30cb244d | 268 | |
MaxScorda | 11:7c7848b76f06 | 269 | int genFunctions::constrain(int amt, int low, int high) |
MaxScorda | 11:7c7848b76f06 | 270 | { |
MaxScorda | 17:9a7f30cb244d | 271 | int ret=amt; |
MaxScorda | 17:9a7f30cb244d | 272 | if (amt>high) ret=high; |
MaxScorda | 17:9a7f30cb244d | 273 | else if (amt<low) ret= low; |
MaxScorda | 17:9a7f30cb244d | 274 | return ret; |
MaxScorda | 17:9a7f30cb244d | 275 | //return ((amt)<(low)?(low):((amt)>(high)?(high):(amt))); |
MaxScorda | 11:7c7848b76f06 | 276 | } |
MaxScorda | 11:7c7848b76f06 | 277 | |
MaxScorda | 11:7c7848b76f06 | 278 | int genFunctions::min(int a, int b) |
MaxScorda | 11:7c7848b76f06 | 279 | { |
MaxScorda | 11:7c7848b76f06 | 280 | return ((a)<(b)?(a):(b)); |
MaxScorda | 11:7c7848b76f06 | 281 | } |
MaxScorda | 11:7c7848b76f06 | 282 | |
MaxScorda | 11:7c7848b76f06 | 283 | int genFunctions::max(int a, int b) |
MaxScorda | 11:7c7848b76f06 | 284 | { |
MaxScorda | 5:0dd768073f59 | 285 | return ((a)>(b)?(a):(b)); |
MaxScorda | 11:7c7848b76f06 | 286 | } |
MaxScorda | 11:7c7848b76f06 | 287 | |
MaxScorda | 11:7c7848b76f06 | 288 | int genFunctions::abs(int x) |
MaxScorda | 11:7c7848b76f06 | 289 | { |
MaxScorda | 5:0dd768073f59 | 290 | return ((x)>0?(x):-(x)); |
MaxScorda | 11:7c7848b76f06 | 291 | } |
MaxScorda | 18:149091052948 | 292 | |
MaxScorda | 18:149091052948 | 293 | /* trim: remove trailing blanks, tabs, newlines */ |
MaxScorda | 18:149091052948 | 294 | int genFunctions::trim(char s[]) |
MaxScorda | 18:149091052948 | 295 | { |
MaxScorda | 18:149091052948 | 296 | int n; |
MaxScorda | 18:149091052948 | 297 | for (n = strlen(s)-1; n >= 0; n--) { |
MaxScorda | 18:149091052948 | 298 | if (s[n] != ' ' && s[n] != '\t' && s[n] != '\n') break; |
MaxScorda | 18:149091052948 | 299 | } |
MaxScorda | 18:149091052948 | 300 | s[n+1] = '\0'; |
MaxScorda | 18:149091052948 | 301 | return n; |
MaxScorda | 18:149091052948 | 302 | } |