11178d775b
This is a rather large refactoring of Tidy's messaging system. This was done mostly to allow non-C libraries that cannot adequately take advantage of arg_lists a chance to query report filter information for information related to arguments used in constructing an error message. Three main goals were in mind for this project: - Don't change the contents of Tidy's existing output sinks. This will ensure that changes do no affect console Tidy users, or LibTidy users who use the output sinks directly. This was accomplished 100% other than some improved cosmetics in the output. See tidy-html5-tests repository, the `refactor` and `more_messages_changes` branches for these minor diffs. - Provide an API that is simple and also extensible without having to write new error filters all the time. This was accomplished by adding the new message callback `TidyMessageCallback` that provides callback functions an opaque object representing the message, and an API to query the message for wanted details. With this, we should never have to add a new callback routine again, as additional API can simply be written against the opaque object. - The API should work the same as the rest of LibTidy's API in that it's consistent and only uses simple types with wide interoperability with other languages. Thanks to @gagern who suggested the model for the API in #409. Although the API uses the "Tidy" way off accessing data via an iterator rather than an index, this can be easily abstracted in the target language. There are two *major* API breaking changes: - Removed TidyReportFilter2 - This was only used by one application in the entire world, and was a hacky kludge that served its purpose. TidyReportCallback (né TidyReportFilter3) is much better. If, for some reason, this affects you, I recommend using TidyReportCallback instead. It's a minor change for your application. - Renamed TidyReportFilter3 to TidyReportCallback - This name is much more semantic, and much more sensible in light of improved callback system. As the name implies, it remains capable of *only* receiving callbacks for Tidy "reports." Introducing TidyMessageCallback, and a new message interrogation API. - As its name implies, it is able to capture (and optionally suppress) *all* of Tidy's output, including the dialogue messages that never make it to the existing report filters. - Provides an opaque `TidyMessage` and an API that can be used to query against it to find the juicy goodness inside. - For example, `tidyGetMessageOutput( tmessage )` will return the complete, localized message. - Another example, `tidyGetMessageLine( tmessage )` will return the line the message applies to. - You can also get information about the individual arguments that make up a message. By using the `tidyGetMessageArguments( tmessage )` itorator and `tidyGetNextMessageArgument` you will obtain an opaque `TidyMessageArgument` which has its own interrogation API. For example: - tidyGetArgType( tmessage, &iterator ); - tidyGetArgFormat( tmessage, &iterator ); - tidyGetArgValueString( tmessage, &iterator ); - …and so on. Other major changes include refactoring `messages.c` to use the new message "object" directly when emitting messages to the console or output sinks. This allowed replacement of a lot of specialized functions with generalized ones. Some of this generalizing involved modifications to the `language_xx.h` header files, and these are all positive improvements even without the above changes.
66 lines
1.6 KiB
C
66 lines
1.6 KiB
C
#ifndef __FORWARD_H__
|
|
#define __FORWARD_H__
|
|
|
|
/* forward.h -- Forward declarations for major Tidy structures
|
|
|
|
(c) 1998-2007 (W3C) MIT, ERCIM, Keio University
|
|
See tidy.h for the copyright notice.
|
|
|
|
Avoids many include file circular dependencies.
|
|
|
|
Try to keep this file down to the minimum to avoid
|
|
cross-talk between modules.
|
|
|
|
Header files include this file. C files include tidy-int.h.
|
|
|
|
*/
|
|
|
|
#include "tidyplatform.h"
|
|
#include "tidy.h"
|
|
|
|
/* Internal symbols are prefixed to avoid clashes with other libraries */
|
|
#define TYDYAPPEND(str1,str2) str1##str2
|
|
#define TY_(str) TYDYAPPEND(prvTidy,str)
|
|
|
|
struct _StreamIn;
|
|
typedef struct _StreamIn StreamIn;
|
|
|
|
struct _StreamOut;
|
|
typedef struct _StreamOut StreamOut;
|
|
|
|
struct _TidyDocImpl;
|
|
typedef struct _TidyDocImpl TidyDocImpl;
|
|
|
|
struct _TidyMessageImpl;
|
|
typedef struct _TidyMessageImpl TidyMessageImpl;
|
|
|
|
struct _Dict;
|
|
typedef struct _Dict Dict;
|
|
|
|
struct _Attribute;
|
|
typedef struct _Attribute Attribute;
|
|
|
|
struct _AttVal;
|
|
typedef struct _AttVal AttVal;
|
|
|
|
struct _Node;
|
|
typedef struct _Node Node;
|
|
|
|
struct _IStack;
|
|
typedef struct _IStack IStack;
|
|
|
|
struct _Lexer;
|
|
typedef struct _Lexer Lexer;
|
|
|
|
extern TidyAllocator TY_(g_default_allocator);
|
|
|
|
/** Wrappers for easy memory allocation using an allocator */
|
|
#define TidyAlloc(allocator, size) ((allocator)->vtbl->alloc((allocator), (size)))
|
|
#define TidyRealloc(allocator, block, size) ((allocator)->vtbl->realloc((allocator), (block), (size)))
|
|
#define TidyFree(allocator, block) ((allocator)->vtbl->free((allocator), (block)))
|
|
#define TidyPanic(allocator, msg) ((allocator)->vtbl->panic((allocator), (msg)))
|
|
#define TidyClearMemory(block, size) memset((block), 0, (size))
|
|
|
|
|
|
#endif /* __FORWARD_H__ */
|