Man Linux: Main Page and Category List

NAME

       gfs_pio_readdelim - read one record

SYNOPSIS

       #include <gfarm/gfarm.h>

       char *gfs_pio_readdelim (GFS_File f, char **bufp, size_t *sizep, size_t
       *lenp, char *delimiter, size_t delimlen);

DESCRIPTION

       gfs_pio_readdelim() works like gfs_pio_readline(), except  a  delimiter
       of  input  records  is  not always newline, and can be specified.  This
       function reads one record from the file specified by the parameter  gf,
       by using the parameter delimiter as the delimiter of the input records.
       You can include ’\0’ character in  the   delimiter,  So,  you  have  to
       specify  the  length  of  the  delimiter by the parameter delimlen.  If
       parameter delimiter is NULL, this function reads  entire  file  as  one
       record.   Otherwise,  and if the parameter delimlen is 0, this function
       treats two or more  consecutive  empty  lines  (/\n\n+/  in  a  regular
       expression)  as  the  input  delimiter.  This  feature  is derived from
       INPUT_RECORD_SEPARATOR in perl language.

       Parameter bufp specifies an address of a pointer variable initialzed by
       NULL   at  first.   gfs_pio_readdelim()  allocates  a  buffer  for  I/O
       dynamically, and stores the address of  the  buffer  to  this  variable
       pointed  by  bufp.   Parameter  sizep  specifies an address of a size_t
       variable initialized by 0.  This size_t variable is used to record  the
       size  of  the  buffer.   Or,  you  can  specify  a  buffer allocated by
       malloc(3) in the variable pointed by the parameter bufp.  In this case,
       you  have  to specify the size of the allocated buffer by the parameter
       sizep.  If the length of the record exceeds the size of the buffer, the
       buffer  will be automatically realloc(3)ed, and the variable pointed by
       bufp and sizep  will  be  updated  respectively.   Note  that  you  are
       responsible to free(3) this buffer.

       This function returns the length of the record to a variable pointed by
       the parameter lenp.  This length includes  the  length  of  the  record
       delimiter.

       This  function  doesn’t  remove  the  delimiter  at the end of records.
       Also, despite that you can use  the  value  returned  by  the  variable
       pointed  by lenp, this function always appends \0’ character at the end
       of records.

       If the file reaches its end, the length of the result record becomes 0.

       gfs_pio_readdelim(f,  bufp,  sizep,  lenp,  "\n",  1)  is equivalent to
       gfs_pio_readline() function.

RETURN VALUES

       NULL   The function terminated successfully.

       GFARM_ERR_NO_MEMORY
              Insufficient memory was available.

              Note that  you  need  to  free(3)  the  buffer  pointed  by  the
              parameter bufp

       Others An  error except the above occurred.  The reason is shown by its
              pointed strings.

EXAMPLES

   EXAMPLE OF GFS_PIO_READDELIM FUNCTION
       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>
       #include <gfarm/gfarm.h>

       int
       main(int argc, char **argv)
       {
            char *e;
            GFS_File gf;
            size_t bufsize = 0, delimlen = 1, len;
            char *buffer = NULL, *delim = "\n";

            e = gfarm_initialize(&argc, &argv);
            if (e != NULL) {
                 fprintf(stderr, "gfarm_initialize: %s\n", e);
                 return (EXIT_FAILURE);
            }
            while ((c = getopt(argc, argv, "d:D")) != -1) {
                 switch (c) {
                 case ’d’:
                      delim = optarg;
                      delimlen = strlen(optarg);
                      break;
                 case ’D’:
                      delim = NULL;
                      delimlen = 0;
                      break;
                 case ’?’:
                 default:
                      fprintf(stderr, "invalid option: %c\n", c);
                      return (EXIT_FAILURE);
                 }
            }
            if (optind >= argc) {
                 fprintf(stderr, "missing gfarm filename\n");
                 return (EXIT_FAILURE);
            }
            e = gfs_pio_open(argv[optind], GFARM_FILE_RDONLY, &gf);
            if (e != NULL) {
                 fprintf(stderr, "%s: %s\n", argv[optind], e);
                 return (EXIT_FAILURE);
            }
            e = gfs_pio_set_view_global(gf, 0);
            if (e != NULL) {
                 fprintf(stderr, "%s: gfs_pio_set_view_global: %s\n",
                     argv[optind], e);
                 return (EXIT_FAILURE);
            }

            while ((e = gfs_pio_readdelim(gf, &buffer, &bufsize, &len,
                delim, delimlen)) == NULL && len > 0) {
                 printf("<%6d/%6d >%s", len, bufsize, buffer);
            }
            if (buffer != NULL)
                 free(buffer);
            if (e != NULL) {
                 fprintf(stderr, "ERROR: %s\n", e);
                 return (EXIT_FAILURE);
            }
            e = gfs_pio_close(gf);
            if (e != NULL) {
                 fprintf(stderr, "gfs_pio_close: %s\n", e);
                 return (EXIT_FAILURE);
            }
            e = gfarm_terminate();
            if (e != NULL) {
                 fprintf(stderr, "gfarm_initialize: %s\n", e);
                 return (EXIT_FAILURE);
            }
            return (EXIT_SUCCESS);
       }

SEE ALSO

       gfs_pio_open(3),          gfs_pio_getline(3),          gfs_pio_gets(3),
       gfs_pio_readline(3)