| 428 | } |
| 429 | |
| 430 | static char * |
| 431 | PLy_procedure_munge_source(const char *name, const char *src) |
| 432 | { |
| 433 | char *mrc, |
| 434 | *mp; |
| 435 | const char *sp; |
| 436 | size_t mlen; |
| 437 | int plen; |
| 438 | |
| 439 | /* |
| 440 | * room for function source and the def statement |
| 441 | */ |
| 442 | mlen = (strlen(src) * 2) + strlen(name) + 16; |
| 443 | |
| 444 | mrc = palloc(mlen); |
| 445 | plen = snprintf(mrc, mlen, "def %s():\n\t", name); |
| 446 | Assert(plen >= 0 && plen < mlen); |
| 447 | |
| 448 | sp = src; |
| 449 | mp = mrc + plen; |
| 450 | |
| 451 | while (*sp != '\0') |
| 452 | { |
| 453 | if (*sp == '\r' && *(sp + 1) == '\n') |
| 454 | sp++; |
| 455 | |
| 456 | if (*sp == '\n' || *sp == '\r') |
| 457 | { |
| 458 | *mp++ = '\n'; |
| 459 | *mp++ = '\t'; |
| 460 | sp++; |
| 461 | } |
| 462 | else |
| 463 | *mp++ = *sp++; |
| 464 | } |
| 465 | *mp++ = '\n'; |
| 466 | *mp++ = '\n'; |
| 467 | *mp = '\0'; |
| 468 | |
| 469 | if (mp > (mrc + mlen)) |
| 470 | elog(FATAL, "buffer overrun in PLy_procedure_munge_source"); |
| 471 | |
| 472 | return mrc; |
| 473 | } |
no test coverage detected