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