Hubbub
generic_rcdata.c
Go to the documentation of this file.
1 /*
2  * This file is part of Hubbub.
3  * Licensed under the MIT License,
4  * http://www.opensource.org/licenses/mit-license.php
5  * Copyright 2008 John-Mark Bell <jmb@netsurf-browser.org>
6  */
7 
8 #include <assert.h>
9 #include <string.h>
10 
11 #include "treebuilder/modes.h"
12 #include "treebuilder/internal.h"
14 #include "utils/utils.h"
15 
16 
25  const hubbub_token *token)
26 {
27  hubbub_error err = HUBBUB_OK;
28  bool done = false;
29 
30  if (treebuilder->context.strip_leading_lr &&
31  token->type != HUBBUB_TOKEN_CHARACTER) {
32  /* Reset the LR stripping flag */
33  treebuilder->context.strip_leading_lr = false;
34  }
35 
36  switch (token->type) {
38  {
39  hubbub_string chars = token->data.character;
40 
41  if (treebuilder->context.strip_leading_lr) {
42  if (chars.ptr[0] == '\n') {
43  chars.ptr++;
44  chars.len--;
45  }
46 
47  treebuilder->context.strip_leading_lr = false;
48  }
49 
50  if (chars.len == 0)
51  break;
52 
53  err = append_text(treebuilder, &chars);
54  }
55  break;
57  {
59  &token->data.tag.name);
60 
61  if (type != treebuilder->context.collect.type) {
63  }
64 
65  if ((treebuilder->context.enable_scripting == true) &&
66  (type == SCRIPT)) {
67  err = complete_script(treebuilder);
68  }
69 
70  done = true;
71  }
72  break;
73  case HUBBUB_TOKEN_EOF:
77  done = true;
78  err = HUBBUB_REPROCESS;
79  break;
83  /* Should never happen */
84  assert(0);
85  break;
86  }
87 
88  if (done) {
89  hubbub_ns ns;
90  element_type otype;
91  void *node;
92 
93  /* Pop the current node from the stack */
94  element_stack_pop(treebuilder, &ns, &otype, &node);
95 
96  treebuilder->tree_handler->unref_node(
97  treebuilder->tree_handler->ctx,
98  node);
99 
100  /* Return to previous insertion mode */
101  treebuilder->context.mode = treebuilder->context.collect.mode;
102  }
103 
104  return err;
105 }
106 
struct hubbub_treebuilder_context::@13 collect
Context for character collecting.
hubbub_token_type type
The token type.
Definition: types.h:120
void * ctx
Context pointer.
Definition: tree.h:292
Token data.
Definition: types.h:119
hubbub_error handle_generic_rcdata(hubbub_treebuilder *treebuilder, const hubbub_token *token)
Handle tokens in "generic rcdata" insertion mode.
hubbub_string name
Tag name.
Definition: types.h:110
hubbub_tree_handler * tree_handler
Callback table.
Definition: internal.h:122
const uint8_t * ptr
Pointer to data.
Definition: types.h:77
element_type
Definition: internal.h:13
Tokeniser string type.
Definition: types.h:76
bool strip_leading_lr
Whether to strip a LR from the start of the next character sequence received.
Definition: internal.h:102
insertion_mode mode
The current insertion mode.
Definition: internal.h:75
size_t len
Byte length of string.
Definition: types.h:78
bool enable_scripting
Whether scripting is enabled.
Definition: internal.h:95
element_type type
Type of node.
Definition: internal.h:99
hubbub_treebuilder_context context
Our context.
Definition: internal.h:120
hubbub_error
Definition: errors.h:18
hubbub_error append_text(hubbub_treebuilder *treebuilder, const hubbub_string *string)
Append text to the current node, inserting into the last child of the current node, iff it&#39;s a Text node.
Definition: treebuilder.c:943
hubbub_error complete_script(hubbub_treebuilder *treebuilder)
Script processing and execution.
Definition: treebuilder.c:925
hubbub_string character
Definition: types.h:129
hubbub_tree_unref_node unref_node
Unreference node.
Definition: tree.h:279
element_type type
Definition: treebuilder.c:25
No error.
Definition: errors.h:19
hubbub_tag tag
Definition: types.h:125
hubbub_ns
Possible namespaces.
Definition: types.h:63
union hubbub_token::@3 data
Type-specific data.
hubbub_error element_stack_pop(hubbub_treebuilder *treebuilder, hubbub_ns *ns, element_type *type, void **node)
Pop an element off the stack of open elements.
Definition: treebuilder.c:1112
element_type element_type_from_name(hubbub_treebuilder *treebuilder, const hubbub_string *tag_name)
Convert an element name into an element type.
Definition: treebuilder.c:986
Treebuilder object.
Definition: internal.h:116