user: 请从给定的汇编指令推导出C源代码：

```asm
<FileExtensionToUpnpClass>:
  endbr64
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,%rbx
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  test   %esi,%esi
  jne    L56
L76:
  cmpb   $0x2e,(%rbx)
  jne    L8
L21:
  lea    D123(%rip),%rsi
  mov    %rbx,%rdi
  call   <stricmp@plt>
  mov    %rax,%rdx
  lea    D188(%rip),%rax
  test   %rdx,%rdx
  jne    L133
L49:
  mov    0x18(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L19
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  ret
L56:
  lea    0xe(%rsp),%rbp
  mov    $0x0,%r8d
  mov    $0x1,%ecx
  mov    $0xa,%edx
  mov    %rdi,%rsi
  mov    %rbp,%rdi
  call   <strToUtf8@plt>
  mov    %rbp,%rbx
  jmp    L76
L8:
  movb   $0x2e,0x4(%rsp)
  lea    0x4(%rsp),%rbp
  lea    0x5(%rsp),%rdi
  mov    %rbx,%rsi
  call   <strcpy@plt>
  mov    %rbp,%rbx
  jmp    L21
L133:
  lea    D154(%rip),%rsi
  mov    %rbx,%rdi
  call   <stricmp@plt>
  mov    %rax,%rdx
  lea    D188(%rip),%rax
  test   %rdx,%rdx
  je     L49
  lea    D46(%rip),%rsi
  mov    %rbx,%rdi
  call   <stricmp@plt>
  mov    %rax,%rdx
  lea    D188(%rip),%rax
  test   %rdx,%rdx
  je     L49
  lea    D19(%rip),%rsi
  mov    %rbx,%rdi
  call   <stricmp@plt>
  mov    %rax,%rdx
  lea    D25(%rip),%rax
  test   %rdx,%rdx
  je     L49
  lea    D161(%rip),%rsi
  mov    %rbx,%rdi
  call   <stricmp@plt>
  mov    %rax,%rdx
  lea    D25(%rip),%rax
  test   %rdx,%rdx
  je     L49
  lea    D0(%rip),%rsi
  mov    %rbx,%rdi
  call   <stricmp@plt>
  mov    %rax,%rdx
  lea    D25(%rip),%rax
  test   %rdx,%rdx
  je     L49
  lea    D160(%rip),%rsi
  mov    %rbx,%rdi
  call   <stricmp@plt>
  mov    %rax,%rdx
  lea    D25(%rip),%rax
  test   %rdx,%rdx
  je     L49
  lea    D229(%rip),%rsi
  mov    %rbx,%rdi
  call   <stricmp@plt>
  mov    %rax,%rdx
  lea    D14(%rip),%rax
  test   %rdx,%rdx
  je     L49
  lea    D91(%rip),%rsi
  mov    %rbx,%rdi
  call   <stricmp@plt>
  mov    %rax,%rdx
  lea    D14(%rip),%rax
  test   %rdx,%rdx
  je     L49
  lea    D232(%rip),%rsi
  mov    %rbx,%rdi
  call   <stricmp@plt>
  mov    %rax,%rdx
  lea    D14(%rip),%rax
  test   %rdx,%rdx
  je     L49
  lea    D228(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmpi@plt>
  mov    %rax,%rdx
  lea    D125(%rip),%rax
  test   %rdx,%rdx
  je     L49
  lea    D101(%rip),%rsi
  mov    %rbx,%rdi
  call   <stricmp@plt>
  test   %rax,%rax
  lea    D125(%rip),%rax
  lea    D179(%rip),%rdx
  cmovne %rdx,%rax
  jmp    L49
L19:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: label: D123
datatype: string
name: retrieve_data
arguments: label: D188
datatype: string
name: retrieve_data
arguments: label: D154
datatype: string
name: retrieve_data
arguments: label: D46
datatype: string
name: retrieve_data
arguments: label: D19
datatype: string
name: retrieve_data
arguments: label: D25
datatype: string
name: retrieve_data
arguments: label: D161
datatype: string
name: retrieve_data
arguments: label: D0
datatype: string
name: retrieve_data
arguments: label: D160
datatype: string
name: retrieve_data
arguments: label: D229
datatype: string
name: retrieve_data
arguments: label: D14
datatype: string
name: retrieve_data
arguments: label: D91
datatype: string
name: retrieve_data
arguments: label: D232
datatype: string
name: retrieve_data
arguments: label: D228
datatype: string
name: retrieve_data
arguments: label: D125
datatype: string
name: retrieve_data
arguments: label: D101
datatype: string
name: retrieve_data
arguments: label: D179
datatype: string

tool: D123: .mp3

tool: D188: object.item.audioItem

tool: D154: .wma

tool: D46: .ogg

tool: D19: .asf

tool: D25: object.item.videoItem

tool: D161: .wmv

tool: D0: .mpg

tool: D160: .mov

tool: D229: .jpg

tool: D14: object.item.imageItem

tool: D91: .jpeg

tool: D232: .bmp

tool: D228: .m3u

tool: D125: object.container.playlistContainer

tool: D101: .asx

tool: D179: object.item

assistant: ```c
char *FileExtensionToUpnpClass(char *extension, int wide) {
  char tempExtension[10], temp2[10];
  char *retVal = NULL;
  if (wide) {
    strToUtf8(temp2, extension, 10, 1, NULL);
    extension = temp2;
  }
  if (extension[0] != '.') {
    tempExtension[0] = '.';
    strcpy(tempExtension + 1, extension);
    extension = tempExtension;
  }
  if (stricmp(extension, ".mp3") == 0) {
    retVal = "object.item.audioItem";
  } else if (stricmp(extension, ".wma") == 0) {
    retVal = "object.item.audioItem";
  } else if (stricmp(extension, ".ogg") == 0) {
    retVal = "object.item.audioItem";
  } else if (stricmp(extension, ".asf") == 0) {
    retVal = "object.item.videoItem";
  } else if (stricmp(extension, ".wmv") == 0) {
    retVal = "object.item.videoItem";
  } else if (stricmp(extension, ".mpg") == 0) {
    retVal = "object.item.videoItem";
  } else if (stricmp(extension, ".mov") == 0) {
    retVal = "object.item.videoItem";
  } else if (stricmp(extension, ".jpg") == 0) {
    retVal = "object.item.imageItem";
  } else if (stricmp(extension, ".jpeg") == 0) {
    retVal = "object.item.imageItem";
  } else if (stricmp(extension, ".bmp") == 0) {
    retVal = "object.item.imageItem";
  } else if (strcmpi(extension, ".m3u") == 0) {
    retVal = "object.container.playlistContainer";
  } else if (stricmp(extension, ".asx") == 0) {
    retVal = "object.container.playlistContainer";
  } else {
    retVal = "object.item";
  }
  return retVal;
}
```