Here's a patch for the tokeniser API documentation based on our discussions.
If the pdf_token_get_string_data/size functions are OK I'll add similar ones for the other token types. -- Michael
# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: [email protected] # target_branch: file:///home/michael/src/%2Blocal/gnupdf/trunk/ # testament_sha1: ab58e9f7613c422a3bfc74ceb9abeb2f7d2406d2 # timestamp: 2009-05-18 19:43:19 -0400 # base_revision_id: jema...@termi-20090518133647-gr5fm4bkhivb1bca # # Begin patch === modified file 'doc/gnupdf.texi' --- doc/gnupdf.texi 2009-05-18 13:36:47 +0000 +++ doc/gnupdf.texi 2009-05-18 23:42:23 +0000 @@ -9866,7 +9866,8 @@ * Creation and destruction of tokenisers:: * Reading tokens:: * Writing tokens:: -* Manipulating PDF tokens:: +* Creating and destroying tokens:: +* Accessing token attributes:: @end menu @node Tokeniser data types @@ -9882,20 +9883,31 @@ Valid values are: @table @code -...@item PDF_TOKEN_BOOLEAN -A PDF boolean value. -...@item PDF_TOKEN_NUMBER -A PDF number value. -...@item PDF_TOKEN_NULL -The null PDF object. +...@item PDF_TOKEN_INTEGER +A PDF integer value. +...@item PDF_TOKEN_REAL +A PDF real value (a floating-point number). @item PDF_TOKEN_STRING -A PDF string value. +A PDF string. @item PDF_TOKEN_NAME -A PDF name value. -...@item PDF_TOKEN_INDIRECT -A PDF indirect reference. +A PDF name. @item PDF_TOKEN_COMMENT A PDF comment. +...@item PDF_TOKEN_KEYWORD +A keyword, i.e., any string of regular characters such as ``null'' +or ``R'' that is not matched as another type. +...@item PDF_TOKEN_DICT_START +The ``<<'' operator, which marks the beginning of a dictionary. +...@item PDF_TOKEN_DICT_END +The ``>>'' operator, which marks the end of a dictionary. +...@item PDF_TOKEN_ARRAY_START +The ``['' operator, which marks the beginning of an array. +...@item PDF_TOKEN_ARRAY_END +The ``]'' operator, which marks the end of an array. +...@item PDF_TOKEN_PROC_START +The `...@{'' operator, which marks the beginning of a procedure. +...@item PDF_TOKEN_PROC_END +The `...@}'' operator, which marks the end of a procedure. @end table @end deftp @@ -10034,7 +10046,7 @@ @end table @end deftypefun -...@deftypefun pdf_status_t pdf_tokeniser_reader_destroy (pdf_tokeniser_reader_t @var{reader}) +...@deftypefun pdf_status_t pdf_token_reader_destroy (pdf_tokeniser_reader_t @var{reader}) Destroy a token reader freeing any used resources. @@ -10062,9 +10074,9 @@ @end table @end deftypefun -...@deftypefun pdf_status_t pdf_tokeniser_writer_destroy (pdf_tokeniser_writer_t @var{writer}) +...@deftypefun pdf_status_t pdf_token_writer_destroy (pdf_tokeniser_writer_t @var{writer}) -Destroy a token writer freeing any used resources. +Destroy a token writer, freeing any used resources. @table @strong @item Parameters @@ -10093,7 +10105,7 @@ @node Reading tokens @subsection Reading tokens -...@deftypefun pdf_status_t pdf_token_read (pdf_token_reader_t @var{reader}, pdf_token_t *...@var{token}) +...@deftypefun pdf_status_t pdf_token_read (pdf_token_reader_t @var{reader}, pdf_u32_t @var{flags}, pdf_token_t *...@var{token}) Read a token from a token reader. @@ -10102,15 +10114,40 @@ @table @var @item reader A token reader. +...@item flags +A bitmask specifying a combination of these flags: +...@table @code +...@item PDF_TOKEN_NO_NAME_ESCAPES +Don't treat ``#'' as a special character when reading name tokens +(this flag should be used when reading PDF 1.1 files). +...@item PDF_TOKEN_RET_COMMENTS +Return comments as tokens (rather than ignoring them). +...@item PDF_TOKEN_END_AT_STREAM +Assume that a ``stream'' keyword token was just read, find the beginning +of the corresponding stream, and return PDF_EEOF when successful +(i.e., when the input stream is positioned after the first line feed). +...@end table @item token -A pointer to a token that will hold the read token. +A pointer to a pdf_token_t that will hold the read token. @end table @item Returns A PDF status value: @table @code @item PDF_OK +The operation succeeded. @item PDF_EAGAIN +It's not possible to read a full token now. +Since one may have been partially read, the operation should be repeated +with the same flags when data becomes available. +...@item PDF_EEOF +Reached the end of the input stream (at a valid position). +...@item PDF_EBADFILE +The stream violates the PDF specifications. +...@item PDF_EIMPLLIMIT +It's not possible to read the next token without exceeding an +implementation limit (e.g., the token is too long). @item PDF_ERROR +An unspecified error occurred. @end table @item Usage example @example @@ -10119,13 +10156,29 @@ @end table @end deftypefun -...@c pdf_token_reader_end_at_stream -...@c pdf_token_reader_reset_state +...@deftypefun pdf_status_t pdf_token_reader_reset (pdf_token_reader_t @var{reader}) + +Reset the state of the token reader. + +...@table @strong +...@item Parameters +...@table @var +...@item reader +A token reader. +...@end table +...@item Returns +A PDF status value: +...@table @code +...@item PDF_OK +The operation succeeded. +...@end table +...@end table +...@end deftypefun @node Writing tokens @subsection Writing tokens -...@deftypefun pdf_status_t pdf_token_write (pdf_token_writer_t @var{writer}, pdf_token_t *...@var{token}) +...@deftypefun pdf_status_t pdf_token_write (pdf_token_writer_t @var{writer}, pdf_u32_t @var{flags}, pdf_token_t @var{token}) Write a given token using a given token writer. @@ -10134,6 +10187,18 @@ @table @var @item writer A token writer. +...@item flags +A bitmask specifying a combination of these flags: +...@table @code +...@item PDF_TOKEN_NO_NAME_ESCAPES +Don't escape special characters using ``#'' when writing name tokens +(this flag should be used when writing PDF 1.1 files). +...@item PDF_TOKEN_HEX_STRINGS +Write strings in hexadecimal encoding. +...@item PDF_TOKEN_READABLE_STRINGS +Encode strings in a human-readable way +(i.e., in hexadecimal or with special characters escaped). +...@end table @item token A PDF token. @end table @@ -10141,8 +10206,16 @@ A PDF status value: @table @code @item PDF_OK +The operation succeeded. @item PDF_EAGAIN +It's not possible to write a full token now. +Since it may have been partially written, the operation must be repeated +with the same arguments when the stream becomes writable. +...@item PDF_EBADDATA +One of the arguments is invalid. This may be caused by an invalid token +(e.g., one that contains unrepresentable characters). @item PDF_ERROR +An unspecified error occurred. @end table @item Usage example @example @@ -10151,10 +10224,243 @@ @end table @end deftypefun -...@c pdf_token_write - -...@node Manipulating PDF tokens -...@subsection Manipulating PDF tokens +...@node Creating and destroying tokens +...@subsection Creating and destroying tokens + +...@deftypefun pdf_status_t pdf_token_integer_new (pdf_i32_t @var{value}, pdf_token_t *...@var{token}) + +Create an integer token. + +...@table @strong +...@item Parameters +...@table @var +...@item value +The numeric value for the token. +...@item token +A pointer to the newly created token. +...@end table +...@item Returns +A PDF status value: +...@table @code +...@item PDF_OK +The operation succeeded. +...@item PDF_ENOMEM +Not enough memory. +...@end table +...@end table + +...@end deftypefun + +...@deftypefun pdf_status_t pdf_token_real_new (pdf_real_t @var{value}, pdf_token_t *...@var{token}) + +Create a real (floating-point number) token. + +...@table @strong +...@item Parameters +...@table @var +...@item value +The numeric value for the token. +...@item token +A pointer to the newly created token. +...@end table +...@item Returns +A PDF status value: +...@table @code +...@item PDF_OK +The operation succeeded. +...@item PDF_EBADDATA +The given value is invalid. +...@item PDF_ENOMEM +Not enough memory. +...@end table +...@end table + +...@end deftypefun + +...@deftypefun pdf_status_t pdf_token_string_new (const pdf_char_t *...@var{value}, pdf_size_t @var{size}, pdf_token_t *...@var{token}) + +Create a string token containing a copy of the given data. + +...@table @strong +...@item Parameters +...@table @var +...@item value +A pointer to the binary data that will make up the string. +...@item size +The amount of data to copy, in octets. +...@item token +A pointer to the newly created token. +...@end table +...@item Returns +A PDF status value: +...@table @code +...@item PDF_OK +The operation succeeded. +...@item PDF_ENOMEM +Not enough memory. +...@end table +...@end table + +...@end deftypefun + +...@deftypefun pdf_status_t pdf_token_name_new (const pdf_char_t *...@var{value}, pdf_size_t @var{size}, pdf_token_t *...@var{token}) + +Create a name token containing a copy of the given data. + +...@table @strong +...@item Parameters +...@table @var +...@item value +A pointer to the binary data that will make up the name. +...@item size +The amount of data to copy, in octets. +...@item token +A pointer to the newly created token. +...@end table +...@item Returns +A PDF status value: +...@table @code +...@item PDF_OK +The operation succeeded. +...@item PDF_ENOMEM +Not enough memory. +...@end table +...@end table + +...@end deftypefun + +...@deftypefun pdf_status_t pdf_token_keyword_new (const pdf_char_t *...@var{value}, pdf_size_t @var{size}, pdf_token_t *...@var{token}) + +Create a keyword token containing a copy of the given data. + +...@table @strong +...@item Parameters +...@table @var +...@item value +A pointer to the binary data that will make up the keyword. +...@item size +The amount of data to copy, in octets. +...@item token +A pointer to the newly created token. +...@end table +...@item Returns +A PDF status value: +...@table @code +...@item PDF_OK +The operation succeeded. +...@item PDF_ENOMEM +Not enough memory. +...@end table +...@end table + +...@end deftypefun + +...@deftypefun pdf_status_t pdf_token_comment_new (const pdf_char_t *...@var{value}, pdf_size_t @var{size}, pdf_bool_t continuation, pdf_token_t *...@var{token}) + +Create a comment token containing a copy of the given data. + +...@table @strong +...@item Parameters +...@table @var +...@item value +A pointer to the binary data that will make up the keyword. +...@item size +The amount of data to copy, in octets. +...@item continuation +A boolean value indicating whether this is a continuation of a previous comment token (if false, it's a new comment). +...@item token +A pointer to the newly created token. +...@end table +...@item Returns +A PDF status value: +...@table @code +...@item PDF_OK +The operation succeeded. +...@item PDF_ENOMEM +Not enough memory. +...@end table +...@end table + +...@end deftypefun + +...@deftypefun pdf_status_t pdf_token_valueless_new (enum pdf_token_type_e @var{type}, pdf_token_t *...@var{token}) + +Create a token of one of the valueless types (PDF_TOKEN_DICT_START, +PDF_TOKEN_DICT_END, PDF_TOKEN_ARRAY_START, PDF_TOKEN_ARRAY_END, +PDF_TOKEN_PROC_START, or PDF_TOKEN_PROC_END). + +...@table @strong +...@item Parameters +...@table @var +...@item type +The type of token to create. +...@item token +A pointer to the newly created token. +...@end table +...@item Returns +A PDF status value: +...@table @code +...@item PDF_OK +The operation succeeded. +...@item PDF_ENOMEM +Not enough memory. +...@item PDF_EBADDATA +The given type is not valid for this constructor. +...@end table +...@end table + +...@end deftypefun + +...@deftypefun pdf_status_t pdf_token_dup (const pdf_token_t @var{old}, pdf_token_t *...@var{new}) + +Create a copy of the given token. + +...@table @strong +...@item Parameters +...@table @var +...@item old +The token to copy. +...@item new +A pointer to the newly created token. +...@end table +...@item Returns +A PDF status value: +...@table @code +...@item PDF_OK +The operation succeeded. +...@item PDF_ENOMEM +Not enough memory. +...@end table +...@end table + +...@end deftypefun + +...@deftypefun pdf_status_t pdf_token_destroy (pdf_token_t @var{token}) + +Destroy the given token, freeing any memory it used. + +...@table @strong +...@item Parameters +...@table @var +...@item old +The token to copy. +...@item new +A pointer to the newly created token. +...@end table +...@item Returns +A PDF status value: +...@table @code +...@item PDF_OK +The operation succeeded. +...@item PDF_ENOMEM +Not enough memory. +...@end table +...@end table + +...@end deftypefun + +...@node Accessing token attributes +...@subsection Accessing token attributes @deftypefun {enum pdf_token_type_e} pdf_token_get_type (pdf_token_t @var{token}) @@ -10176,7 +10482,10 @@ /* ... */ /* Read a name */ -pdf_token_read (reader, &token); +if (pdf_token_read (reader, &token) != PDF_OK) +...@{ + /* Error */ +...@} if (pdf_token_get_type (token) != PDF_TOKEN_NAME) @{ /* We were expecting a name */ @@ -10185,38 +10494,94 @@ @end table @end deftypefun -...@deftypefun pdf_status_t pdf_token_set_attr (pdf_token_t @var{token}, pdf_token_attr_t @var{attr}) - -Set a given attribute @var{attr} in a given token. - -...@table @strong -...@item Parameters -...@table @var -...@item token -A token. -...@item attr -A token attribute. -...@end table -...@item Returns -A PDF status value: -...@table @code -...@item PDF_OK -...@item PDF_ERROR -...@end table -...@item Usage example -...@example -XXX -...@end example -...@end table -...@end deftypefun - -...@c pdf_token_get_string -...@c pdf_token_get_integer -...@c pdf_token_get_real - -...@c pdf_token_set_string -...@c pdf_token_set_integer -...@c pdf_token_set_real +...@c TODO: pdf_bool_t pdf_token_equal_p (pdf_token_t token1, pdf_token_t token2); +...@c -- if needed + +...@deftypefun pdf_i32_t pdf_token_get_integer_value (const pdf_token_t @var{token}) + +Returns the value associated with a given integer token. + +...@table @strong +...@item Parameters +...@table @var +...@item token +A token of type PDF_TOKEN_INTEGER. +...@end table +...@item Returns +The token's value. +...@end table + +...@end deftypefun + +...@deftypefun pdf_real_t pdf_token_get_real_value (const pdf_token_t @var{token}) + +Returns the value associated with a given real token. + +...@table @strong +...@item Parameters +...@table @var +...@item token +A token of type PDF_TOKEN_REAL. +...@end table +...@item Returns +The token's value. +...@end table + +...@end deftypefun + +...@deftypefun const pdf_char_t *pdf_token_get_string_data (const pdf_token_t @var{token}) + +Returns a pointer to the data associated with a given string token. + +...@table @strong +...@item Parameters +...@table @var +...@item token +A token of type PDF_TOKEN_STRING. +...@end table +...@item Returns +A pointer to the string data, which will be valid until the token is destroyed. +The data is @strong{not} null-terminated. +...@end table + +...@end deftypefun + +...@deftypefun pdf_size_t pdf_token_get_string_size (const pdf_token_t @var{token}) + +Returns the amount of data associated with a given string token. + +...@table @strong +...@item Parameters +...@table @var +...@item token +A token of type PDF_TOKEN_STRING. +...@end table +...@item Returns +The string size, in octets. +...@end table + +...@end deftypefun + +...@c TODO: pdf_token_get_{name,keyword,comment}_{data,size} +...@c -- these are basically the same as the string functions, +...@c except the name and keyword data is null-terminated + +...@deftypefun pdf_bool_t pdf_token_get_comment_continued (const pdf_token_t @var{token}) + +Returns the continuation flag associated with a given comment token. + +...@table @strong +...@item Parameters +...@table @var +...@item token +A token of type PDF_TOKEN_COMMENT. +...@end table +...@item Returns +True if the comment is continued from the comment token +that precedes it in the stream; False if it's a new comment. +...@end table + +...@end deftypefun @node Encryption @section Encryption @@ -13289,17 +13654,23 @@ @tab 10^10 bytes @tab Largest supported PDF file using a cross-reference table. @item integer -...@tab ??? +...@tab 2^32 - 1 @tab Largest integer value. +...@item integer +...@tab -2^32 +...@tab Smallest integer value. @item real -...@tab ??? +...@tab FLT_MAX @tab Largest real value. +...@item real +...@tab -FLT_MAX +...@tab Smallest real value. @item string in content stream @tab 32767 @tab Maximum length of a string contained in a content stream, in bytes. @item name -...@tab ??? +...@tab 32767 @tab Maximum length of a name, in bytes. @item indirect object @tab ?? # Begin bundle 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
signature.asc
Description: Digital signature
