trusty (3) pcreprecompile.3.gz

Provided by: libpcre3-dev_8.31-2ubuntu2.3_amd64 bug

NAME

       PCRE - Perl-compatible regular expressions

SAVING AND RE-USING PRECOMPILED PCRE PATTERNS

       If  you  are  running  an  application that uses a large number of regular expression patterns, it may be
       useful to store them in a precompiled form instead of having to compile them every time  the  application
       is  run.   If  you  are not using any private character tables (see the pcre_maketables() documentation),
       this is relatively straightforward. If you are using private tables, it is a little bit more complicated.
       However,  if  you  are using the just-in-time optimization feature, it is not possible to save and reload
       the JIT data.

       If you save compiled patterns to a file, you can copy them to a different host and run them there. If the
       two     hosts     have     different     endianness     (byte     order),     you    should    run    the
       pcre[16]_pattern_to_host_byte_order() function on the new host before trying to match  the  pattern.  The
       matching functions return PCRE_ERROR_BADENDIANNESS if they detect a pattern with the wrong endianness.

       Compiling regular expressions with one version of PCRE for use with a different version is not guaranteed
       to work and may cause crashes, and saving and restoring a compiled pattern  loses  any  JIT  optimization
       data.

SAVING A COMPILED PATTERN

       The  value  returned  by  pcre[16]_compile()  points  to a single block of memory that holds the compiled
       pattern  and  associated  data.  You  can  find  the  length  of  this  block   in   bytes   by   calling
       pcre[16]_fullinfo()  with  an  argument  of PCRE_INFO_SIZE. You can then save the data in any appropriate
       manner. Here is sample code for the 8-bit library that compiles a pattern and writes it  to  a  file.  It
       assumes that the variable fd refers to a file that is open for output:

         int erroroffset, rc, size;
         char *error;
         pcre *re;

         re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL);
         if (re == NULL) { ... handle errors ... }
         rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);
         if (rc < 0) { ... handle errors ... }
         rc = fwrite(re, 1, size, fd);
         if (rc != size) { ... handle errors ... }

       In  this  example,  the  bytes  that  comprise the compiled pattern are copied exactly. Note that this is
       binary data that may contain any of the 256 possible byte values. On  systems  that  make  a  distinction
       between binary and non-binary data, be sure that the file is opened for binary output.

       If  you  want to write more than one pattern to a file, you will have to devise a way of separating them.
       For binary data, preceding each pattern with its length is probably the  most  straightforward  approach.
       Another possibility is to write out the data in hexadecimal instead of binary, one pattern to a line.

       Saving  compiled  patterns  in  a file is only one possible way of storing them for later use. They could
       equally well be saved in a database, or in the memory of some daemon process that passes them via sockets
       to the processes that want them.

       If  the  pattern  has been studied, it is also possible to save the normal study data in a similar way to
       the compiled pattern itself. However, if the PCRE_STUDY_JIT_COMPILE was used, the just-in-time data  that
       is  created  cannot  be  saved  because  it  is  too  dependent on the current environment. When studying
       generates additional information, pcre[16]_study() returns a pointer to a pcre[16]_extra data block.  Its
       format is defined in the section on matching a pattern in the pcreapi documentation. The study_data field
       points to the binary study data, and this is what you must save (not the  pcre[16]_extra  block  itself).
       The  length  of  the  study  data  can  be  obtained  by  calling pcre[16]_fullinfo() with an argument of
       PCRE_INFO_STUDYSIZE. Remember to check that pcre[16]_study() did return a non-NULL value before trying to
       save the study data.

RE-USING A PRECOMPILED PATTERN

       Re-using  a  precompiled  pattern  is  straightforward.  Having  reloaded  it  into  main  memory, called
       pcre[16]_pattern_to_host_byte_order()  if  necessary,  you  pass  its  pointer  to   pcre[16]_exec()   or
       pcre[16]_dfa_exec() in the usual way.

       However,  if  you passed a pointer to custom character tables when the pattern was compiled (the tableptr
       argument  of  pcre[16]_compile()),  you  must  now  pass  a  similar  pointer   to   pcre[16]_exec()   or
       pcre[16]_dfa_exec(),  because  the  value  saved  with the compiled pattern will obviously be nonsense. A
       field in a pcre[16]_extra() block is used to pass this data, as described in the section  on  matching  a
       pattern in the pcreapi documentation.

       If you did not provide custom character tables when the pattern was compiled, the pointer in the compiled
       pattern is NULL, which causes the matching functions to use PCRE's internal tables. Thus, you do not need
       to take any special action at run time in this case.

       If  you saved study data with the compiled pattern, you need to create your own pcre[16]_extra data block
       and  set  the  study_data  field  to  point  to  the  reloaded  study  data.  You  must  also   set   the
       PCRE_EXTRA_STUDY_DATA  bit  in  the  flags  field  to  indicate that study data is present. Then pass the
       pcre[16]_extra block to the matching function in the usual way. If the pattern was studied  for  just-in-
       time optimization, that data cannot be saved, and so is lost by a save/restore cycle.

COMPATIBILITY WITH DIFFERENT PCRE RELEASES

       In  general,  it  is safest to recompile all saved patterns when you update to a new PCRE release, though
       not all updates actually require this.

AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.

REVISION

       Last updated: 10 January 2012
       Copyright (c) 1997-2012 University of Cambridge.