コード例 #1
0
ファイル: parser.c プロジェクト: roox/myhtml
size_t myhtml_parser_add_text_with_charef(myhtml_tree_t *tree, myhtml_string_t* string, const char *text, size_t begin, size_t length)
{
    myhtml_incoming_buf_t *inc_buf = myhtml_parser_find_first_buf(tree, begin);
    
    myhtml_string_char_ref_chunk_t str_chunk = {0, 0, 0, NULL, tree->encoding};
    myhtml_encoding_result_clean(&str_chunk.res);
    
    size_t current_buf_offset = begin - inc_buf->offset;
    size_t save_str_len = string->length;
    
    if((current_buf_offset + length) <= inc_buf->size)
    {
        myhtml_string_append_charef(&str_chunk, string, &inc_buf->data[current_buf_offset], length);
        myhtml_string_append_charef_end(&str_chunk, string);
        return (string->length - save_str_len);
    }
    
    size_t buf_next_offset = inc_buf->size - current_buf_offset;
    
    myhtml_string_append_charef(&str_chunk, string, &inc_buf->data[current_buf_offset], buf_next_offset);
    
    length = length - buf_next_offset;
    inc_buf = inc_buf->next;
    
    while (inc_buf && length)
    {
        if(length > inc_buf->size) {
            myhtml_string_append_charef(&str_chunk, string, inc_buf->data, inc_buf->size);
            length -= inc_buf->size;
        }
        else {
            myhtml_string_append_charef(&str_chunk, string, inc_buf->data, length);
            break;
        }
        
        inc_buf = inc_buf->next;
    }
    
    myhtml_string_append_charef_end(&str_chunk, string);
    return (string->length - save_str_len);
}
コード例 #2
0
ファイル: parser.c プロジェクト: adrianhust/myhtml
void myhtml_parser_drop_first_newline(myhtml_tree_t *tree, size_t *begin, size_t *length)
{
    if(*length == 0)
        return;
    
    myhtml_incoming_buf_t *inc_buf = myhtml_parser_find_first_buf(tree, *begin);
    
    size_t current_buf_offset = *begin - inc_buf->offset;
    
    if(inc_buf->data[current_buf_offset] == '\n') {
        (*begin)++;
        (*length)--;
    }
    else if(inc_buf->data[current_buf_offset] == '\r') {
        current_buf_offset++;
        (*begin)++;
        (*length)--;
        
        if(*length > 1 && inc_buf->data[current_buf_offset] == '\n') {
            (*begin)++;
            (*length)--;
        }
    }
}
コード例 #3
0
ファイル: parser.c プロジェクト: roox/myhtml
size_t myhtml_parser_add_text(myhtml_tree_t *tree, myhtml_string_t* string, const char *text, size_t begin, size_t length)
{
    myhtml_incoming_buf_t *inc_buf = myhtml_parser_find_first_buf(tree, begin);
    
    size_t current_buf_offset = begin - inc_buf->offset;
    size_t save_str_len = string->length;
    
    if((current_buf_offset + length) <= inc_buf->size)
    {
        if(tree->encoding == MyHTML_ENCODING_UTF_8)
            myhtml_string_append(string, &inc_buf->data[current_buf_offset], length);
        else
            myhtml_string_append_with_convert_encoding(string,
                                                       &inc_buf->data[current_buf_offset],
                                                       length, tree->encoding);
        
        return (string->length - save_str_len);
    }
    
    size_t buf_next_offset = inc_buf->size - current_buf_offset;
    
    myhtml_encoding_result_t res;
    myhtml_encoding_result_clean(&res);
    
    if(tree->encoding == MyHTML_ENCODING_UTF_8)
        myhtml_string_append(string, &inc_buf->data[current_buf_offset], buf_next_offset);
    else
        myhtml_string_append_chunk_with_convert_encoding(string, &res, &inc_buf->data[current_buf_offset],
                                                         buf_next_offset, tree->encoding);
    
    length = length - buf_next_offset;
    inc_buf = inc_buf->next;
    
    if(tree->encoding == MyHTML_ENCODING_UTF_8) {
        while (inc_buf && length)
        {
            if(length > inc_buf->size) {
                myhtml_string_append(string, inc_buf->data, inc_buf->size);
                length -= inc_buf->size;
            }
            else {
                myhtml_string_append(string, inc_buf->data, length);
                break;
            }
            
            inc_buf = inc_buf->next;
        }
    }
    else {
        while (inc_buf && length)
        {
            if(length > inc_buf->size) {
                myhtml_string_append_chunk_with_convert_encoding(string, &res, inc_buf->data,
                                                                 inc_buf->size, tree->encoding);
                length -= inc_buf->size;
            }
            else {
                myhtml_string_append_chunk_with_convert_encoding(string, &res, inc_buf->data,
                                                                 length, tree->encoding);
                break;
            }
            
            inc_buf = inc_buf->next;
        }
    }
    
    return (string->length - save_str_len);
}