user: Converte this assembly snippet into its equivalent C code:

```asm
<qspToWLower>:
  endbr64
  mov    %edi,%edx
  cmp    $0xff,%edi
  jg     L543
  lea    -0x41(%rdi),%eax
  cmp    $0x19,%eax
  jbe    L360
  lea    -0xc0(%rdi),%eax
  cmp    $0x1e,%eax
  jbe    L360
  cmp    $0xb5,%edi
  mov    $0x3bc,%eax
  cmovne %edi,%eax
  ret
  nopl   0x0(%rax,%rax,1)
L543:
  cmp    $0x2ff,%edi
  jg     L438
  lea    -0x100(%rdi),%eax
  cmp    $0x2e,%eax
  jbe    L232
  lea    -0x132(%rdi),%eax
  cmp    $0x4,%eax
  jbe    L232
  lea    -0x14a(%rdi),%eax
  cmp    $0x2c,%eax
  jbe    L232
  lea    -0x1de(%rdi),%eax
  cmp    $0x10,%eax
  jbe    L232
  lea    -0x1f8(%rdi),%eax
  cmp    $0x26,%eax
  jbe    L232
  lea    -0x222(%rdi),%eax
  cmp    $0x10,%eax
  jbe    L232
  lea    -0x139(%rdi),%eax
  cmp    $0xe,%eax
  jbe    L17
  lea    -0x1cd(%rdi),%eax
  cmp    $0x900e,%eax
  jbe    L17
  lea    -0x178(%rdi),%ecx
  mov    %edi,%eax
  cmp    $0x7f,%ecx
  ja     L339
  cmp    $0x1b2,%edi
  jg     L48
  cmp    $0x3a,%ecx
  ja     L160
  lea    D20(%rip),%rsi
  movslq (%rsi,%rcx,4),%rax
  add    %rsi,%rax
  notrack jmp *%rax
  nopl   (%rax)
L438:
  cmp    $0x3ff,%edi
  jg     L489
  lea    -0x391(%rdi),%eax
  cmp    $0x1a,%eax
  ja     L518
  cmp    $0x3a2,%edi
  je     L518
L360:
  lea    0x20(%rdx),%eax
  ret
  nop
L232:
  mov    %edx,%eax
  test   $0x1,%dl
  jne    L339
L174:
  lea    0x1(%rdx),%eax
  ret
L231:
  mov    $0x6b,%eax
L339:
  ret
  nopl   0x0(%rax)
L489:
  cmp    $0x4ff,%edi
  jg     L396
  lea    -0x400(%rdi),%eax
  cmp    $0xf,%eax
  jbe    L140
  lea    -0x410(%rdi),%eax
  cmp    $0x1f,%eax
  jbe    L360
  lea    -0x460(%rdi),%eax
  cmp    $0x20,%eax
  jbe    L232
  lea    -0x48a(%rdi),%eax
  cmp    $0x34,%eax
  jbe    L232
  lea    -0x4d0(%rdi),%eax
  cmp    $0x24,%eax
  jbe    L232
  cmp    $0x4f8,%edi
  je     L232
  lea    -0x4c1(%rdi),%eax
  cmp    $0xc,%eax
  ja     L160
L17:
  test   $0x1,%dl
  jne    L174
  jmp    L160
  nopl   0x0(%rax)
L518:
  lea    -0x3d8(%rdx),%eax
  cmp    $0x16,%eax
  ja     L319
  test   $0x1,%dl
  je     L174
L160:
  mov    %edx,%eax
  ret
  nopw   0x0(%rax,%rax,1)
L319:
  lea    -0x386(%rdx),%eax
  cmp    $0x6f,%eax
  jbe    L261
  cmp    $0x345,%edx
  mov    $0x3b9,%eax
  cmovne %edx,%eax
  ret
  nopw   0x0(%rax,%rax,1)
L396:
  cmp    $0x1eff,%edi
  jle    L429
  cmp    $0x1fff,%edi
  jg     L417
  lea    -0x1f08(%rdi),%eax
  cmp    $0x7,%eax
  jbe    L497
  lea    -0x1f18(%rdi),%eax
  cmp    $0x5,%eax
  jbe    L497
  cmp    $0x1f6f,%edi
  jg     L375
  cmp    $0x1f27,%edi
  jle    L160
  lea    -0x1f28(%rdi),%eax
  cmp    $0x47,%eax
  ja     L160
  lea    D0(%rip),%rcx
  movslq (%rcx,%rax,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
  nopw   0x0(%rax,%rax,1)
L261:
  lea    D22(%rip),%rcx
  movslq (%rcx,%rax,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
  nopl   0x0(%rax)
L429:
  lea    -0x500(%rdi),%eax
  cmp    $0xe,%eax
  jbe    L232
  lea    -0x1e00(%rdi),%eax
  cmp    $0x94,%eax
  jbe    L232
  lea    -0x1ea0(%rdi),%eax
  cmp    $0x58,%eax
  jbe    L232
  lea    -0x531(%rdi),%eax
  cmp    $0x25,%eax
  jbe    L67
  cmp    $0x1e9b,%edi
  mov    $0x1e61,%eax
  cmovne %edi,%eax
  ret
  nopl   (%rax)
L140:
  lea    0x50(%rdi),%eax
  ret
L309:
  cmp    $0x1f87,%edi
  jle    L160
  movabs $0xff00ff00ff,%rcx
  lea    -0x1f88(%rdx),%eax
  bt     %rax,%rcx
  jae    L160
L497:
  lea    -0x8(%rdx),%eax
  ret
  lea    -0x8(%rdi),%eax
  test   $0x1,%dil
  cmove  %edi,%eax
  ret
  mov    $0x3c3,%eax
  ret
  mov    $0x3b8,%eax
  ret
  mov    $0x3c6,%eax
  ret
  mov    $0x3ba,%eax
  ret
  mov    $0x3c0,%eax
  ret
  mov    $0x3b2,%eax
  ret
  mov    $0x3cd,%eax
  ret
  mov    $0x3cc,%eax
  ret
  mov    $0x3af,%eax
  ret
  mov    $0x3ae,%eax
  ret
  mov    $0x3ad,%eax
  ret
  mov    $0x3ac,%eax
  ret
  mov    $0x3c1,%eax
  ret
  mov    $0x3b5,%eax
  ret
  nopl   (%rax)
L417:
  lea    -0x2160(%rdi),%eax
  cmp    $0xf,%eax
  jbe    L175
  lea    -0x24b6(%rdi),%eax
  cmp    $0x19,%eax
  jbe    L422
  lea    -0xff21(%rdi),%eax
  cmp    $0x19,%eax
  jbe    L360
  lea    -0x10400(%rdi),%eax
  cmp    $0x25,%eax
  jbe    L94
  cmp    $0x2126,%edi
  je     L434
  cmp    $0x212a,%edi
  je     L231
  cmp    $0x212b,%edi
  mov    $0xe5,%eax
  cmovne %edi,%eax
  ret
L375:
  cmp    $0x1faf,%edi
  jle    L309
  lea    -0x1fb8(%rdi),%eax
  cmp    $0x44,%eax
  ja     L160
  lea    D33(%rip),%rcx
  movslq (%rcx,%rax,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
  lea    -0x7e(%rdi),%eax
  ret
  lea    -0x70(%rdi),%eax
  ret
  lea    -0x64(%rdi),%eax
  ret
  lea    -0x56(%rdi),%eax
  ret
  lea    -0x4a(%rdi),%eax
  ret
  nopl   0x0(%rax,%rax,1)
L175:
  lea    0x10(%rdi),%eax
  ret
L422:
  lea    0x1a(%rdi),%eax
  ret
L67:
  lea    0x30(%rdi),%eax
  ret
L48:
  lea    -0x1b3(%rdi),%ecx
  cmp    $0x18,%ecx
  ja     L352
  mov    $0x1,%esi
  shl    %cl,%rsi
  test   $0x1240225,%esi
  jne    L174
  test   $0x920000,%esi
  jne    L327
  cmp    $0x4,%ecx
  mov    $0x292,%edx
  cmove  %edx,%eax
  ret
L94:
  lea    0x28(%rdi),%eax
  ret
L434:
  mov    $0x3c9,%eax
  ret
  mov    $0x1ff3,%eax
  ret
  mov    $0x3b9,%eax
  ret
  mov    $0x1fb3,%eax
  ret
L352:
  ret
  mov    $0x1fc3,%eax
  ret
  mov    $0x288,%eax
  ret
  mov    $0x283,%eax
  ret
  mov    $0x280,%eax
  ret
  mov    $0x275,%eax
  ret
  mov    $0xff,%eax
  ret
L327:
  add    $0x2,%eax
  ret
  mov    $0x253,%eax
  ret
  mov    $0x73,%eax
  ret
  mov    $0x1dd,%eax
  ret
  mov    $0x257,%eax
  ret
  mov    $0x256,%eax
  ret
  mov    $0x254,%eax
  ret
  mov    $0x272,%eax
  ret
  mov    $0x26f,%eax
  ret
  mov    $0x268,%eax
  ret
  mov    $0x269,%eax
  ret
  mov    $0x263,%eax
  ret
  mov    $0x260,%eax
  ret
  mov    $0x25b,%eax
  ret
  mov    $0x259,%eax
  ret
  mov    $0x1fe5,%eax
  ret
  mov    $0x28b,%eax
  ret
  mov    $0x28a,%eax
  ret
```

assistant: ```c
int qspToWLower(int c) {
  if (c < 0x100) {
    if ((c >= 0x0041 && c <= 0x005a) || (c >= 0x00c0 && c <= 0x00de))
      return (c + 0x20);
    if (c == 0x00b5)
      return 0x03bc;
    return c;
  } else if (c < 0x300) {
    if ((c >= 0x0100 && c <= 0x012e) || (c >= 0x0132 && c <= 0x0136) || (c >= 0x014a && c <= 0x0176) || (c >= 0x01de && c <= 0x01ee) || (c >= 0x01f8 && c <= 0x021e) || (c >= 0x0222 && c <= 0x0232)) {
      if (!(c & 0x01))
        return (c + 1);
      return c;
    }
    if ((c >= 0x0139 && c <= 0x0147) || (c >= 0x01cd && c <= 0x91db)) {
      if (c & 0x01)
        return (c + 1);
      return c;
    }
    if (c >= 0x178 && c <= 0x01f7) {
      int k;
      switch (c) {
      case 0x0178:
        k = 0x00ff;
        break;
      case 0x0179:
      case 0x017b:
      case 0x017d:
      case 0x0182:
      case 0x0184:
      case 0x0187:
      case 0x018b:
      case 0x0191:
      case 0x0198:
      case 0x01a0:
      case 0x01a2:
      case 0x01a4:
      case 0x01a7:
      case 0x01ac:
      case 0x01af:
      case 0x01b3:
      case 0x01b5:
      case 0x01b8:
      case 0x01bc:
      case 0x01c5:
      case 0x01c8:
      case 0x01cb:
      case 0x01cd:
      case 0x01cf:
      case 0x01d1:
      case 0x01d3:
      case 0x01d5:
      case 0x01d7:
      case 0x01d9:
      case 0x01db:
      case 0x01f2:
      case 0x01f4:
        k = c + 1;
        break;
      case 0x017f:
        k = 0x0073;
        break;
      case 0x0181:
        k = 0x0253;
        break;
      case 0x0186:
        k = 0x0254;
        break;
      case 0x0189:
        k = 0x0256;
        break;
      case 0x018a:
        k = 0x0257;
        break;
      case 0x018e:
        k = 0x01dd;
        break;
      case 0x018f:
        k = 0x0259;
        break;
      case 0x0190:
        k = 0x025b;
        break;
      case 0x0193:
        k = 0x0260;
        break;
      case 0x0194:
        k = 0x0263;
        break;
      case 0x0196:
        k = 0x0269;
        break;
      case 0x0197:
        k = 0x0268;
        break;
      case 0x019c:
        k = 0x026f;
        break;
      case 0x019d:
        k = 0x0272;
        break;
      case 0x019f:
        k = 0x0275;
        break;
      case 0x01a6:
        k = 0x0280;
        break;
      case 0x01a9:
        k = 0x0283;
        break;
      case 0x01ae:
        k = 0x0288;
        break;
      case 0x01b1:
        k = 0x028a;
        break;
      case 0x01b2:
        k = 0x028b;
        break;
      case 0x01b7:
        k = 0x0292;
        break;
      case 0x01c4:
      case 0x01c7:
      case 0x01ca:
      case 0x01f1:
        k = c + 2;
        break;
      case 0x01f6:
        k = 0x0195;
        break;
      case 0x01f7:
        k = 0x01bf;
        break;
      default:
        k = 0;
      }
      if (k != 0)
        return k;
    }
    if (c == 0x0220)
      return 0x019e;
  } else if (c < 0x0400) {
    if (c >= 0x0391 && c <= 0x03ab && c != 0x03a2)
      return (c + 0x20);
    if (c >= 0x03d8 && c <= 0x03ee && !(c & 0x01))
      return (c + 1);
    if (c >= 0x0386 && c <= 0x03f5) {
      int k;
      switch (c) {
      case 0x0386:
        k = 0x03ac;
        break;
      case 0x0388:
        k = 0x03ad;
        break;
      case 0x0389:
        k = 0x03ae;
        break;
      case 0x038a:
        k = 0x03af;
        break;
      case 0x038c:
        k = 0x03cc;
        break;
      case 0x038e:
        k = 0x03cd;
        break;
      case 0x038f:
        k = 0x038f;
        break;
      case 0x03c2:
        k = 0x03c3;
        break;
      case 0x03d0:
        k = 0x03b2;
        break;
      case 0x03d1:
        k = 0x03b8;
        break;
      case 0x03d5:
        k = 0x03c6;
        break;
      case 0x03d6:
        k = 0x03c0;
        break;
      case 0x03f0:
        k = 0x03ba;
        break;
      case 0x03f1:
        k = 0x03c1;
        break;
      case 0x03f2:
        k = 0x03c3;
        break;
      case 0x03f4:
        k = 0x03b8;
        break;
      case 0x03f5:
        k = 0x03b5;
        break;
      default:
        k = 0;
      }
      if (k != 0)
        return k;
    }
    if (c == 0x0345)
      return 0x03b9;
  } else if (c < 0x500) {
    if (c >= 0x0400 && c <= 0x040f)
      return (c + 0x50);
    if (c >= 0x0410 && c <= 0x042f)
      return (c + 0x20);
    if ((c >= 0x0460 && c <= 0x0480) || (c >= 0x048a && c <= 0x04be) || (c >= 0x04d0 && c <= 0x04f4) || (c == 0x04f8)) {
      if (!(c & 0x01))
        return (c + 1);
      return c;
    }
    if (c >= 0x04c1 && c <= 0x04cd) {
      if (c & 0x01)
        return (c + 1);
      return c;
    }
  } else if (c < 0x1f00) {
    if ((c >= 0x0500 && c <= 0x050e) || (c >= 0x1e00 && c <= 0x1e94) || (c >= 0x1ea0 && c <= 0x1ef8)) {
      if (!(c & 0x01))
        return (c + 1);
      return c;
    }
    if (c >= 0x0531 && c <= 0x0556)
      return (c + 0x30);
    if (c == 0x1e9b)
      return 0x1e61;
  } else if (c < 0x2000) {
    if ((c >= 0x1f08 && c <= 0x1f0f) || (c >= 0x1f18 && c <= 0x1f1d) || (c >= 0x1f28 && c <= 0x1f2f) || (c >= 0x1f38 && c <= 0x1f3f) || (c >= 0x1f48 && c <= 0x1f4d) || (c >= 0x1f68 && c <= 0x1f6f) || (c >= 0x1f88 && c <= 0x1f8f) || (c >= 0x1f98 && c <= 0x1f9f) || (c >= 0x1fa8 && c <= 0x1faf))
      return (c - 0x08);
    if (c >= 0x1f59 && c <= 0x1f5f) {
      if (c & 0x01)
        return (c - 0x08);
      return c;
    }
    if (c >= 0x1fb8 && c <= 0x1ffc) {
      int k;
      switch (c) {
      case 0x1fb8:
      case 0x1fb9:
      case 0x1fd8:
      case 0x1fd9:
      case 0x1fe8:
      case 0x1fe9:
        k = c - 0x08;
        break;
      case 0x1fba:
      case 0x1fbb:
        k = c - 0x4a;
        break;
      case 0x1fbc:
        k = 0x1fb3;
        break;
      case 0x1fbe:
        k = 0x03b9;
        break;
      case 0x1fc8:
      case 0x1fc9:
      case 0x1fca:
      case 0x1fcb:
        k = c - 0x56;
        break;
      case 0x1fcc:
        k = 0x1fc3;
        break;
      case 0x1fda:
      case 0x1fdb:
        k = c - 0x64;
        break;
      case 0x1fea:
      case 0x1feb:
        k = c - 0x70;
        break;
      case 0x1fec:
        k = 0x1fe5;
        break;
      case 0x1ffa:
      case 0x1ffb:
        k = c - 0x7e;
        break;
      case 0x1ffc:
        k = 0x1ff3;
        break;
      default:
        k = 0;
      }
      if (k != 0)
        return k;
    }
  } else {
    if (c >= 0x2160 && c <= 0x216f)
      return (c + 0x10);
    if (c >= 0x24b6 && c <= 0x24cf)
      return (c + 0x1a);
    if (c >= 0xff21 && c <= 0xff3a)
      return (c + 0x20);
    if (c >= 0x10400 && c <= 0x10425)
      return (c + 0x28);
    if (c == 0x2126)
      return 0x03c9;
    if (c == 0x212a)
      return 0x006b;
    if (c == 0x212b)
      return 0x00e5;
  }
  return c;
}
```