| 546 | #define addstr(a,b,l) ( memcpy(a,b,(l) * sizeof(char)), a += (l) ) |
| 547 | |
| 548 | void luaO_chunkid (char *out, const char *source, size_t srclen) { |
| 549 | size_t bufflen = LUA_IDSIZE; /* free space in buffer */ |
| 550 | if (*source == '=') { /* 'literal' source */ |
| 551 | if (srclen <= bufflen) /* small enough? */ |
| 552 | memcpy(out, source + 1, srclen * sizeof(char)); |
| 553 | else { /* truncate it */ |
| 554 | addstr(out, source + 1, bufflen - 1); |
| 555 | *out = '\0'; |
| 556 | } |
| 557 | } |
| 558 | else if (*source == '@') { /* file name */ |
| 559 | if (srclen <= bufflen) /* small enough? */ |
| 560 | memcpy(out, source + 1, srclen * sizeof(char)); |
| 561 | else { /* add '...' before rest of name */ |
| 562 | addstr(out, RETS, LL(RETS)); |
| 563 | bufflen -= LL(RETS); |
| 564 | memcpy(out, source + 1 + srclen - bufflen, bufflen * sizeof(char)); |
| 565 | } |
| 566 | } |
| 567 | else { /* string; format as [string "source"] */ |
| 568 | const char *nl = strchr(source, '\n'); /* find first new line (if any) */ |
| 569 | addstr(out, PRE, LL(PRE)); /* add prefix */ |
| 570 | bufflen -= LL(PRE RETS POS) + 1; /* save space for prefix+suffix+'\0' */ |
| 571 | if (srclen < bufflen && nl == NULL) { /* small one-line source? */ |
| 572 | addstr(out, source, srclen); /* keep it */ |
| 573 | } |
| 574 | else { |
| 575 | if (nl != NULL) srclen = nl - source; /* stop at first newline */ |
| 576 | if (srclen > bufflen) srclen = bufflen; |
| 577 | addstr(out, source, srclen); |
| 578 | addstr(out, RETS, LL(RETS)); |
| 579 | } |
| 580 | memcpy(out, POS, (LL(POS) + 1) * sizeof(char)); |
| 581 | } |
| 582 | } |
| 583 |
no outgoing calls
no test coverage detected