user: Please show me the C implementation that matches the assembly code listed below:

```asm
<C_mkKindC>:
  endbr64
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  sub    $0x8,%rsp
  call   <strlen@plt>
  lea    0x45b(%rax),%rdi
  call   <UTIL_mallocStr@plt>
  lea    D7(%rip),%rsi
  mov    %rax,%r12
  mov    %rax,%rdi
  call   <strcpy@plt>
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <strcat@plt>
  mov    %r12,%rdi
  lea    D13(%rip),%rsi
  call   <strcat@plt>
  mov    %r12,%rdi
  lea    D10(%rip),%rsi
  call   <strcat@plt>
  add    $0x8,%rsp
  mov    %r12,%rax
  pop    %rbp
  pop    %r12
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D7
datatype: string
name: extract_symbolic_data
arguments: data_label: D13
datatype: string
name: extract_symbolic_data
arguments: data_label: D10
datatype: string

tool: D7: /****************************************************************************/
/*   PERVASIVE KIND                                                         */ 
/****************************************************************************/ 


tool: D13: PERV_KindData PERV_getKindData(int index)                                     
{                                                                              
    return PERV_kindDataTab[index];                                            
}                                                                            



tool: D10: void PERV_copyKindDataTab(PERV_KindData* dst)                                 
{                                                                              
    //this way of copy relies on the assumption that the pervasive kind data   
    //has the same structure as that of the run-time kind symbol table entries.
    memcpy((void*)dst, (void*)PERV_kindDataTab,                                
           sizeof(PERV_KindData) * PERV_KIND_NUM);                             
}                                                                            



assistant: ```c
char *C_mkKindC(char *kindTab) {
  size_t length = strlen("/****************************************************************************/\n/*   PERVASIVE KIND                                                         */ \n/****************************************************************************/ \n") + strlen(kindTab) + strlen("PERV_KindData PERV_getKindData(int index)                                     \n{                                                                              \n    return PERV_kindDataTab[index];                                            \n}                                                                            \n\n") + strlen("void PERV_copyKindDataTab(PERV_KindData* dst)                                 \n{                                                                              \n    //this way of copy relies on the assumption that the pervasive kind data   \n    //has the same structure as that of the run-time kind symbol table entries.\n    memcpy((void*)dst, (void*)PERV_kindDataTab,                                \n           sizeof(PERV_KindData) * PERV_KIND_NUM);                             \n}                                                                            \n\n");
  char *kindC = UTIL_mallocStr(length);
  strcpy(kindC, "/****************************************************************************/\n/*   PERVASIVE KIND                                                         */ \n/****************************************************************************/ \n");
  strcat(kindC, kindTab);
  strcat(kindC, "PERV_KindData PERV_getKindData(int index)                                     \n{                                                                              \n    return PERV_kindDataTab[index];                                            \n}                                                                            \n\n");
  strcat(kindC, "void PERV_copyKindDataTab(PERV_KindData* dst)                                 \n{                                                                              \n    //this way of copy relies on the assumption that the pervasive kind data   \n    //has the same structure as that of the run-time kind symbol table entries.\n    memcpy((void*)dst, (void*)PERV_kindDataTab,                                \n           sizeof(PERV_KindData) * PERV_KIND_NUM);                             \n}                                                                            \n\n");
  return kindC;
}
```