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

```asm
<info>:
  endbr64
  sub    $0x8,%rsp
  lea    D0(%rip),%rdi
  call   <printf@plt>
  lea    D237(%rip),%rdi
  call   <printf@plt>
  lea    D279(%rip),%rdi
  call   <printf@plt>
  lea    D327(%rip),%rdi
  call   <printf@plt>
  lea    D146(%rip),%rdi
  call   <printf@plt>
  lea    D143(%rip),%rdi
  call   <printf@plt>
  lea    D158(%rip),%rdi
  call   <printf@plt>
  lea    D90(%rip),%rdi
  call   <printf@plt>
  lea    D252(%rip),%rdi
  call   <printf@plt>
  lea    D156(%rip),%rdi
  call   <printf@plt>
  lea    D120(%rip),%rdi
  call   <printf@plt>
  lea    D275(%rip),%rdi
  call   <printf@plt>
  lea    D228(%rip),%rdi
  call   <printf@plt>
  lea    D301(%rip),%rdi
  call   <printf@plt>
  lea    D12(%rip),%rdi
  call   <printf@plt>
  lea    D17(%rip),%rdi
  call   <printf@plt>
  lea    D151(%rip),%rdi
  call   <printf@plt>
  lea    D170(%rip),%rdi
  call   <printf@plt>
  lea    D126(%rip),%rdi
  call   <printf@plt>
  lea    D70(%rip),%rdi
  call   <printf@plt>
  lea    D2(%rip),%rdi
  call   <printf@plt>
  lea    D10(%rip),%rdi
  call   <printf@plt>
  lea    D274(%rip),%rdi
  call   <printf@plt>
  lea    D77(%rip),%rdi
  call   <printf@plt>
  lea    D241(%rip),%rdi
  call   <printf@plt>
  lea    D173(%rip),%rdi
  call   <printf@plt>
  lea    D48(%rip),%rdi
  call   <printf@plt>
  lea    D245(%rip),%rdi
  call   <printf@plt>
  lea    D76(%rip),%rdi
  call   <printf@plt>
  lea    D6(%rip),%rdi
  call   <printf@plt>
  lea    D259(%rip),%rdi
  call   <printf@plt>
  lea    D71(%rip),%rdi
  call   <printf@plt>
  lea    D290(%rip),%rdi
  call   <printf@plt>
  xor    %edi,%edi
  add    $0x8,%rsp
  jmp    1070 <exit@plt>
```

tool_calls: name: parse_data
arguments: label: D0
datatype: string
name: parse_data
arguments: label: D237
datatype: string
name: parse_data
arguments: label: D279
datatype: string
name: parse_data
arguments: label: D327
datatype: string
name: parse_data
arguments: label: D146
datatype: string
name: parse_data
arguments: label: D143
datatype: string
name: parse_data
arguments: label: D158
datatype: string
name: parse_data
arguments: label: D90
datatype: string
name: parse_data
arguments: label: D252
datatype: string
name: parse_data
arguments: label: D156
datatype: string
name: parse_data
arguments: label: D120
datatype: string
name: parse_data
arguments: label: D275
datatype: string
name: parse_data
arguments: label: D228
datatype: string
name: parse_data
arguments: label: D301
datatype: string
name: parse_data
arguments: label: D12
datatype: string
name: parse_data
arguments: label: D17
datatype: string
name: parse_data
arguments: label: D151
datatype: string
name: parse_data
arguments: label: D170
datatype: string
name: parse_data
arguments: label: D126
datatype: string
name: parse_data
arguments: label: D70
datatype: string
name: parse_data
arguments: label: D2
datatype: string
name: parse_data
arguments: label: D10
datatype: string
name: parse_data
arguments: label: D274
datatype: string
name: parse_data
arguments: label: D77
datatype: string
name: parse_data
arguments: label: D241
datatype: string
name: parse_data
arguments: label: D173
datatype: string
name: parse_data
arguments: label: D48
datatype: string
name: parse_data
arguments: label: D245
datatype: string
name: parse_data
arguments: label: D76
datatype: string
name: parse_data
arguments: label: D6
datatype: string
name: parse_data
arguments: label: D259
datatype: string
name: parse_data
arguments: label: D71
datatype: string
name: parse_data
arguments: label: D290
datatype: string

tool: D0: Usage: xy2ij [options] -g <grid file> -o <point file>


tool: D237: Where:


tool: D279:   <grid file> -- text file with node coordinates (see remarks below)


tool: D327:     (use "stdin" or "-" for standard input)


tool: D146:   <point file> -- text file with coordinates to be converted (first two


tool: D143:     columns used as point coordinates) (use "stdin" or "-" for standard input)


tool: D158: Options:


tool: D90:   -f -- do not exit with error for points outside grid


tool: D252:   -i <node type> -- input node type


tool: D156:   -r -- Make convertion from index to physical space


tool: D120:   -v -- Verbose / version


tool: D275: Node types:


tool: D228:   DD -- double density nodes (default) 


tool: D301:   CO -- cell corner nodes


tool: D12: Description:


tool: D17:   `xy2ij' reads grid nodes from a file. After that, it reads points from


tool: D151:    standard input, converts them from (X,Y) to (I,J) space or vice versa,


tool: D170:    and writes results to the standard output.


tool: D126: Remarks:


tool: D70:   1. The input file must contain header describing the node array dimension:


tool: D2:      ## <nx> x <ny>


tool: D10:      where for double density nodes nx = nce1 * 2 + 1, ny = nce2 * 2 + 1;


tool: D274:      for corner nodes  nx = nce1 + 1, ny = nce2 + 1; and for center nodes


tool: D77:      nx = nce1, ny = nce2.


tool: D241:   2. After the header, the grid file must contain (nx * ny) lines with X and


tool: D173:      Y node coordinates.


tool: D48:   3. An empty or commented line in the input grid file as well as NaNs for


tool: D245:      node coordinates indicate an invalid node.


tool: D76:   4. A grid cell is valid if all corner nodes are valid (not NaNs). Only


tool: D6:      points in valid cells may be converted between physical and index


tool: D259:      space.


tool: D71:   5. The grid (union of all valid grid cells) must be simply connected both in


tool: D290:      physical and index space.


assistant: ```c
void info() {
  printf("Usage: xy2ij [options] -g <grid file> -o <point file>\n");
  printf("Where:\n");
  printf("  <grid file> -- text file with node coordinates (see remarks below)\n");
  printf("    (use \"stdin\" or \"-\" for standard input)\n");
  printf("  <point file> -- text file with coordinates to be converted (first two\n");
  printf("    columns used as point coordinates) (use \"stdin\" or \"-\" for standard input)\n");
  printf("Options:\n");
  printf("  -f -- do not exit with error for points outside grid\n");
  printf("  -i <node type> -- input node type\n");
  printf("  -r -- Make convertion from index to physical space\n");
  printf("  -v -- Verbose / version\n");
  printf("Node types:\n");
  printf("  DD -- double density nodes (default) \n");
  printf("  CO -- cell corner nodes\n");
  printf("Description:\n");
  printf("  `xy2ij' reads grid nodes from a file. After that, it reads points from\n");
  printf("   standard input, converts them from (X,Y) to (I,J) space or vice versa,\n");
  printf("   and writes results to the standard output.\n");
  printf("Remarks:\n");
  printf("  1. The input file must contain header describing the node array dimension:\n");
  printf("     ## <nx> x <ny>\n");
  printf("     where for double density nodes nx = nce1 * 2 + 1, ny = nce2 * 2 + 1;\n");
  printf("     for corner nodes  nx = nce1 + 1, ny = nce2 + 1; and for center nodes\n");
  printf("     nx = nce1, ny = nce2.\n");
  printf("  2. After the header, the grid file must contain (nx * ny) lines with X and\n");
  printf("     Y node coordinates.\n");
  printf("  3. An empty or commented line in the input grid file as well as NaNs for\n");
  printf("     node coordinates indicate an invalid node.\n");
  printf("  4. A grid cell is valid if all corner nodes are valid (not NaNs). Only\n");
  printf("     points in valid cells may be converted between physical and index\n");
  printf("     space.\n");
  printf("  5. The grid (union of all valid grid cells) must be simply connected both in\n");
  printf("     physical and index space.\n");
  exit(0);
}
```