diff --git a/docs/metadesk_reference.md b/docs/metadesk_reference.md index 583a326..f7e269f 100644 --- a/docs/metadesk_reference.md +++ b/docs/metadesk_reference.md @@ -96,9 +96,9 @@ main: @send(Strings) @doc("This type is implemented as a singly linked list with an MD_String8 at each node.") -@see(MD_PushStringToList) -@see(MD_SplitString) -@see(MD_JoinStringList) +@see(MD_S8ListPush) +@see(MD_S8Split) +@see(MD_S8ListJoin) @struct MD_String8List: { @doc("The number of nodes in the list.") node_count: MD_u64, @@ -156,9 +156,9 @@ main: @send(Strings) @doc("This type is used to report the results of consuming one character from a unicode encoded stream.") -@see(MD_CodepointFromUtf8) -@see(MD_CodepointFromUtf16) -@struct MD_UnicodeConsume: { +@see(MD_DecodeCodepointFromUtf8) +@see(MD_DecodeCodepointFromUtf16) +@struct MD_DecodedCodepoint: { @doc("The codepoint of the consumed character.") codepoint: MD_u32, @@ -167,8 +167,8 @@ main: }; @send(Strings) -@doc("These constants control how MD_StyledStringFromString forms strings.") -@enum MD_WordStyle: { +@doc("These constants control how MD_S8Stylize forms strings.") +@enum MD_IdentifierStyle: { @doc("Also known as @code 'PascalCase'. Creates identifiers that look like: @code `ExampleIdentifier`") UpperCamelCase, @doc("Creates identifiers that look like: @code `exampleIdentifier`") @@ -284,14 +284,14 @@ main: @doc("The string of the token labeling this node, after processing. Processing removing quote marks that delimits string literals and character literals") string: MD_String8, @doc("The raw string of the token labeling this node.") - whole_string: MD_String8, + raw_string: MD_String8, @doc("A hash of the string field using the metadesk built in hash function.") string_hash: MD_u64, @doc("The raw string of the comment token before this node, if there is one.") - comment_before: MD_String8, + prev_comment: MD_String8, @doc("The raw string of the comment token after this node, if there is one.") - comment_after: MD_String8, + next_comment: MD_String8, @doc("The byte-offset into the string from which this node was parsed. Used for producing data for an MD_CodeLoc.") offset: MD_u64, @@ -404,7 +404,7 @@ main: @doc("The contents of this token, not including any boundary characters.") string: MD_String8; @doc("The full contents of the string used to form this token, including all boundary characters.") - outer_string: MD_String8; + raw_string: MD_String8; }; //////////////////////////////// @@ -425,9 +425,9 @@ main: @send(Parsing) @doc("This type encodes information about messages.") -@struct MD_Error: { +@struct MD_Message: { @doc("A pointer to the next error, in a chain of errors. This is @code '0' when it is the last error in a chain.") - next: *MD_Error, + next: *MD_Message, @doc("The node that this message refers to.") node: *MD_Node, @doc("This message's kind.") @@ -438,22 +438,22 @@ main: @send(Parsing) @doc("This type is for a chain of error messages, with data about the entire list.") -@struct MD_ErrorList: +@struct MD_MessageList: { @doc("""The "worst" message kind in this chain, where a message kind is "worse" than another if it has a higher numeric value (if it is defined later in MD_MessageKind) than another.""") - max_error_kind: MD_MessageKind; + max_message_kind: MD_MessageKind; @doc("The number of errors in this list.") node_count: MD_u64; @doc("The first error in the list.") - first: *MD_Error; + first: *MD_Message; @doc("The last error in the list.") - last: *MD_Error; + last: *MD_Message; } @send(Parsing) @struct MD_ParseResult: { node: *MD_Node; - first_error: *MD_Error; + first_error: *MD_Message; bytes_parse: MD_u64; }; @@ -482,9 +482,9 @@ main: @doc("The last node, in a chain, produced by the parser, when the parsing call is capable of returning many nodes.") last_node: *MD_Node; @doc("The number of bytes processed by the parser. Any bytes after this number, in the string that was passed to the parser, were not considered.") - bytes_parsed: MD_u64; + string_advance: MD_u64; @doc("The list of errors produced by the parser when parsing the provided string.") - errors: MD_ErrorList; + errors: MD_MessageList; } //////////////////////////////// @@ -492,12 +492,12 @@ main: @send(CommandLineHelper) @doc("A type used to encode parsed command line options, that can have values associated with them.") -@see(MD_CommandLine) -@see(MD_CommandLineFromOptions) -@struct MD_CommandLineOption: +@see(MD_CmdLine) +@see(MD_MakeCmdLineFromOptions) +@struct MD_CmdLineOption: { @doc("A pointer to the next option, if this is within a chain of options. Will be @code '0' if this is the last option in a chain.") - next: *MD_CommandLineOption; + next: *MD_CmdLineOption; @doc("The name of this option.") name: MD_String8; @doc("The values associated with this option.") @@ -506,17 +506,17 @@ main: @send(CommandLineHelper) @doc("The type encoding a fully parsed set of command line options.") -@see(MD_CommandLineFromOptions) -@struct MD_CommandLine: +@see(MD_MakeCmdLineFromOptions) +@struct MD_CmdLine: { @doc("The list of all command line arguments, as an unstructured list of strings.") arguments: MD_String8List; @doc("The list of arguments that were not parsed as structured options (which are a name, with an optional set of values).") - inputs: MD_String8List; + raw_arguments: MD_String8List; @doc("The first option that was parsed, forming the head of a chain of options.") - first_option: *MD_CommandLineOption; + first_option: *MD_CmdLineOption; @doc("The last option that was parsed.") - last_option: *MD_CommandLineOption; + last_option: *MD_CmdLineOption; }; //////////////////////////////// @@ -758,7 +758,7 @@ main: @send(Characters) @doc("Return a @code '/' if @code '\\' is passed in, otherwise just returns the passed character.") -@func MD_CorrectSlash: { +@func MD_CharToForwardSlash: { c: MD_u8, return: MD_u8, }; @@ -791,14 +791,14 @@ main: @send(Strings) @doc("Constructs an MD_String8 from two pointers into the same buffer, corresponding to the beginning and one past the last byte of a string.") @func MD_S8Range: { - str: *MD_u8, + first: *MD_u8, opl: *MD_u8, return: MD_String8, }; @send(Strings) @doc("Returns an MD_String8 encoding a sub-range of the passed MD_String8.") -@func MD_StringSubstring: { +@func MD_S8Substring: { @doc("The string for which the substring is returned.") str: MD_String8, @doc("The offset, from the passed string's base, of the first character of the returned substring.") @@ -810,7 +810,7 @@ main: @send(Strings) @doc("Returns a sub-range of the passed MD_String8, skipping the first @code 'min' bytes.") -@func MD_StringSkip: { +@func MD_S8Skip: { @doc("The string for which the substring is returned.") str: MD_String8, @doc("The new minimum offset, relative to the base of @code 'str'. Also the number of bytes to skip at the beginning of @code 'str'.") @@ -820,7 +820,7 @@ main: @send(Strings) @doc("Returns a sub-range of the passed MD_String8, chopping off the last @code 'min' bytes.") -@func MD_StringChop: { +@func MD_S8Chop: { @doc("The string for which the substring is returned.") str: MD_String8, @doc("The number of bytes to chop off at the end of @code 'str'.") @@ -830,7 +830,7 @@ main: @send(Strings) @doc("Returns a prefix of the passed MD_String8.") -@func MD_StringPrefix: { +@func MD_S8Prefix: { @doc("The string for which the substring is returned.") str: MD_String8, @doc("The desired size of the returned prefix.") @@ -840,7 +840,7 @@ main: @send(Strings) @doc("Returns a suffix of the passed MD_String8.") -@func MD_StringSuffix: { +@func MD_S8Suffix: { @doc("The string for which the substring is returned.") str: MD_String8, @doc("The desired size of the returned suffix.") @@ -850,7 +850,7 @@ main: @send(Strings) @doc("Compares the passed strings @code 'a' and @code 'b', and determines whether or not the two strings match. The passed MD_MatchFlags argument will modify the string matching algorithm; for example, allowing case insensitivity. Return @code '1' if the strings are found to match, and @code '0' otherwise.") -@func MD_StringMatch: { +@func MD_S8Match: { @doc("The first string to compare.") a: MD_String8, @doc("The second string to compare.") @@ -863,7 +863,7 @@ main: @send(Strings) @doc("Searches @code 'str' for an occurrence of @code 'substring'. The passed @code 'flags' can be used to modify the matching rules. Returns the position at which the search ended; if the return value is equivalent to @code 'str.size', then the substring was not found.") -@func MD_FindSubstring: { +@func MD_S8FindSubstring: { @doc("The string to search within for the substring.") str: MD_String8, @doc("The 'needle' string to find within @code 'str'.") @@ -878,64 +878,64 @@ main: @send(Strings) @doc("Searches @code 'string' for the last @code '.' character occurring in the string, and chops the @code '.' and anything following after it off of the returned string.") -@see(MD_StringChop) -@func MD_ChopExtension: { +@see(MD_S8Chop) +@func MD_PathChopLastPeriod: { string: MD_String8, return: MD_String8, }; @send(Strings) @doc("Searches @code 'string' for the last @code '/' or @code '\' character occurring in the string, and skips it and anything before it in the returned string.") -@see(MD_StringSkip) -@func MD_SkipFolder: { +@see(MD_S8Skip) +@func MD_PathSkipLastSlash: { string: MD_String8, return: MD_String8, }; @send(Strings) @doc("Searches @code 'string' for the last @code '.' character, and returns the substring starting at the character after it, to the end of the string. For usual file naming schemes where the extension of a file is encoded by any characters following the last @code '.' of a filename, this will return the extension.") -@see(MD_FolderFromPath) -@see(MD_StringSuffix) -@see(MD_StringSubstring) -@see(MD_StringChop) -@func MD_ExtensionFromPath: { +@see(MD_PathChopLastSlash) +@see(MD_S8Suffix) +@see(MD_S8Substring) +@see(MD_S8Chop) +@func MD_PathSkipLastPeriod: { string: MD_String8, return: MD_String8, }; @send(Strings) @doc("Searches @code 'string' for the last @code '/' or @code '\\' character, and returns the substring that ends with that character. For usual file naming schemes where folders are encoded with @code '/' or @code '\\' characters, this will return the entire path to the passed filename, not including the filename itself.") -@see(MD_ExtensionFromPath) -@see(MD_StringPrefix) -@see(MD_StringSubstring) -@see(MD_StringSkip) -@func MD_FolderFromPath: { +@see(MD_PathSkipLastPeriod) +@see(MD_S8Prefix) +@see(MD_S8Substring) +@see(MD_S8Skip) +@func MD_PathChopLastSlash: { string: MD_String8, return: MD_String8, }; @send(Strings) @doc("Copies @code 'string' by allocating an entirely new portion of memory and copying the passed string's memory to the newly allocated memory. Returns the copy of @code 'string' using the new memory.") -@func MD_PushStringCopy: { +@func MD_S8Copy: { string: MD_String8, return: MD_String8, }; @send(Strings) -@doc("Allocates a new string, with the contents of the string being determined by a mostly-standard C formatting string passed in @code 'fmt', with a variable-argument list being passed in @code 'args'. Used when composing variable argument lists at multiple levels, and when you need to pass a @code 'va_list'. The format string is non-standard because it allows @code '%S' as a specifier for MD_String8 arguments. Before this call, it is expected that you call @code 'va_start' on the passed @code 'va_list', and also that you call @code 'va_end' after the function returns. If you just want to pass variable arguments yourself (instead of a @code 'va_list'), then see MD_PushStringF.") -@see(MD_PushStringF) -@see(MD_PushStringCopy) -@func MD_PushStringFV: { +@doc("Allocates a new string, with the contents of the string being determined by a mostly-standard C formatting string passed in @code 'fmt', with a variable-argument list being passed in @code 'args'. Used when composing variable argument lists at multiple levels, and when you need to pass a @code 'va_list'. The format string is non-standard because it allows @code '%S' as a specifier for MD_String8 arguments. Before this call, it is expected that you call @code 'va_start' on the passed @code 'va_list', and also that you call @code 'va_end' after the function returns. If you just want to pass variable arguments yourself (instead of a @code 'va_list'), then see MD_S8Fmt.") +@see(MD_S8Fmt) +@see(MD_S8Copy) +@func MD_S8FmtV: { fmt: *char, args: va_list, return: MD_String8, }; @send(Strings) -@doc("Allocates a new string, with the contents of the string being determined by a mostly-standard C formatting string passed in @code 'fmt', with variable arguments fitting the expected ones in @code 'fmt' being passed in after. The format string is non-standard because it allows @code '%S' as a specifier for MD_String8 arguments. If you are composing this with your own variable-arguments call, use MD_PushStringFV instead.") -@see(MD_PushStringFV) -@see(MD_PushStringCopy) -@func MD_PushStringF: { +@doc("Allocates a new string, with the contents of the string being determined by a mostly-standard C formatting string passed in @code 'fmt', with variable arguments fitting the expected ones in @code 'fmt' being passed in after. The format string is non-standard because it allows @code '%S' as a specifier for MD_String8 arguments. If you are composing this with your own variable-arguments call, use MD_S8FmtV instead.") +@see(MD_S8FmtV) +@see(MD_S8Copy) +@func MD_S8Fmt: { fmt: *char, "...", return: MD_String8, @@ -944,14 +944,14 @@ main: @send(Strings) @doc("This is a helper macro that is normally used with passing an MD_String8 into a @code 'printf' like function, usually used in combination with the @code '%.*s' format specifier. Metadesk uses length-based strings, not null-terminated (like many C functions expect), so this is often convenient when interacting with C-like APIs. This will expand to passing the size of the passed string first, a comma, and the pointer to the base of the string being passed immediately after.") @see(MD_String8) -@macro MD_StringExpand: { s, } +@macro MD_S8VArg: { s, } @send(Strings) @doc("Pushes a new MD_String8 to an MD_String8List by allocating a new MD_String8Node, filling it with @code 'string', and modifying the existing list elements in @code 'list' to end with the newly allocated node.") @see(MD_String8List) @see(MD_String8Node) @see(MD_String8) -@func MD_PushStringToList: { +@func MD_S8ListPush: { list: *MD_String8List, string: MD_String8, }; @@ -961,8 +961,8 @@ main: @see(MD_String8List) @see(MD_String8Node) @see(MD_String8) -@see(MD_PushStringToList) -@func MD_PushStringListToList: { +@see(MD_S8ListPush) +@func MD_S8ListConcat: { list: *MD_String8List, to_push: *MD_String8List, }; @@ -972,8 +972,8 @@ main: @see(MD_String8) @see(MD_String8List) @see(MD_String8Node) -@see(MD_JoinStringList) -@func MD_SplitString: { +@see(MD_S8ListJoin) +@func MD_S8Split: { @doc("The string to search for splitting strings, and to subdivide.") string: MD_String8, @doc("The number of splitting strings to search for.") @@ -989,8 +989,8 @@ main: @see(MD_String8) @see(MD_String8List) @see(MD_String8Node) -@see(MD_SplitString) -@func MD_JoinStringList: { +@see(MD_S8Split) +@func MD_S8ListJoin: { list: MD_String8List, separator: MD_String8, return: MD_String8, @@ -1003,9 +1003,9 @@ main: }; @send(Strings) -@func MD_StyledStringFromString: { +@func MD_S8Stylize: { string: MD_String8, - word_style: MD_WordStyle, + word_style: MD_IdentifierStyle, separator: MD_String8, return: MD_String8 }; @@ -1056,17 +1056,17 @@ main: //~ Unicode Conversions @send(Strings) -@func MD_CodepointFromUtf8: { +@func MD_DecodeCodepointFromUtf8: { str: MD_u8, max: MD_u64, - return: MD_UnicodeConsume, + return: MD_DecodedCodepoint, }; @send(Strings) -@func MD_CodepointFromUtf16: { +@func MD_DecodeCodepointFromUtf16: { str: *MD_u16, max: MD_u64, - return: MD_UnicodeConsume, + return: MD_DecodedCodepoint, }; @send(Strings) @@ -1111,13 +1111,13 @@ main: //~ Map Table Data Structure @send(Map) -@func MD_HashString: { +@func MD_HashStr: { string: MD_String8, return: MD_u64, }; @send(Map) -@func MD_HashPointer: { +@func MD_HashPtr: { p: *void, }; @@ -1199,8 +1199,8 @@ MD_LexAdvanceFromSkips: } @send(Parsing) @func -@doc("Allocates and initializes an MD_Error associated with a particular MD_Node.") -@see(MD_Error) +@doc("Allocates and initializes an MD_Message associated with a particular MD_Node.") +@see(MD_Message) MD_MakeNodeError: { @doc("The node associated with the message.") @@ -1209,12 +1209,12 @@ MD_MakeNodeError: kind: MD_MessageKind; @doc("The string for the message.") str: MD_String8; - return: *MD_Error + return: *MD_Message } @send(Parsing) @func -@doc("Allocates and initializes an MD_Error associated with a particular MD_Token.") -@see(MD_Error) +@doc("Allocates and initializes an MD_Message associated with a particular MD_Token.") +@see(MD_Message) MD_MakeTokenError: { @doc("The entire string that is being parsed. The parser used a substring of this string to form @code 'token'.") @@ -1225,27 +1225,27 @@ MD_MakeTokenError: kind: MD_MessageKind; @doc("The string for the message.") str: MD_String8; - return: *MD_Error; + return: *MD_Message; } @send(Parsing) @func -@doc("Pushes a constructed MD_Error into an MD_ErrorList.") -@see(MD_Error) -@see(MD_ErrorList) -MD_PushErrorToList: +@doc("Pushes a constructed MD_Message into an MD_MessageList.") +@see(MD_Message) +@see(MD_MessageList) +MD_MessageListPush: { - list: *MD_ErrorList; - error: *MD_Error; + list: *MD_MessageList; + error: *MD_Message; } @send(Parsing) @func -@see(MD_Error) -@see(MD_ErrorList) +@see(MD_Message) +@see(MD_MessageList) @doc("Pushes the contents of @code 'to_push' into @code 'list'. Zeroes @code 'to_push'; the memory used in forming @code 'to_push' will be used in @code 'list', and nothing will be copied.") -MD_PushErrorListToList: +MD_MessageListConcat: { - list: *MD_ErrorList; - to_push: *MD_ErrorList; + list: *MD_MessageList; + to_push: *MD_MessageList; } @send(Parsing) @func @@ -1321,7 +1321,7 @@ MD_ParseWholeFile: @send(CodeLoc) @doc("Calculates a position in a source code file in filename/line/column coordinates, provided a filename, a base pointer for the file's contents, and an offset into the file's contents.") @see(MD_CodeLocFromNode) -@func MD_CodeLocFromFileBaseOffset: +@func MD_CodeLocFromFileOffset: { filename: MD_String8, base: *MD_u8, @@ -1331,7 +1331,7 @@ MD_ParseWholeFile: @send(CodeLoc) @doc("Calculates a position in a source code file in filename/line/column coordinates, provided a parsed MD_Node.") -@see(MD_CodeLocFromFileBaseOffset) +@see(MD_CodeLocFromFileOffset) @func MD_CodeLocFromNode: { node: *MD_Node, @@ -1372,7 +1372,7 @@ MD_ParseWholeFile: @send(Nodes) @doc("Creates a new reference node, pointing at @code 'target', and links it up as a child of @code 'list'.") -@func MD_PushReference: { +@func MD_PushNewReference: { list: *MD_Node, target: *MD_Node, return: *MD_Node, @@ -1384,7 +1384,7 @@ MD_ParseWholeFile: @send(Nodes) @doc("Finds a node in the range defined by @code 'first' and @code 'one_past_last', with the string matching @code 'string' in accordance with @code 'flags', or returns a nil node pointer if it is not found.") @see(MD_NodeFromIndex) -@see(MD_StringMatch) +@see(MD_S8Match) @func MD_NodeFromString: { @doc("The first node in the range to search.") first: *MD_Node, @@ -1573,10 +1573,10 @@ MD_ParseWholeFile: @send(Nodes) @doc("Prints a message to @code 'out', corresponding with the source code location encoded by @code 'loc'.") -@see(MD_MessageF) -@see(MD_NodeMessage) -@see(MD_NodeMessageF) -@func MD_Message: { +@see(MD_PrintMessageFmt) +@see(MD_PrintNodeMessage) +@see(MD_PrintNodeMessageFmt) +@func MD_PrintMessage: { @doc("The file to print the message to.") out: *FILE, @doc("The source code location for which the message is intended.") @@ -1589,10 +1589,10 @@ MD_ParseWholeFile: @send(Nodes) @doc("Prints a C format string message to @code 'out', corresponding with the source code location encoded by @code 'loc'.") -@see(MD_Message) -@see(MD_NodeMessage) -@see(MD_NodeMessageF) -@func MD_MessageF: { +@see(MD_PrintMessage) +@see(MD_PrintNodeMessage) +@see(MD_PrintNodeMessageFmt) +@func MD_PrintMessageFmt: { @doc("The file to print the message to.") out: *FILE, @doc("The source code location for which the message is intended.") @@ -1605,11 +1605,11 @@ MD_ParseWholeFile: }; @send(Nodes) -@see(MD_Message) -@see(MD_MessageF) -@see(MD_NodeMessageF) +@see(MD_PrintMessage) +@see(MD_PrintMessageFmt) +@see(MD_PrintNodeMessageFmt) @doc("Prints a message to @code 'out', corresponding with the source code location of @code 'node'.") -@func MD_NodeMessage: { +@func MD_PrintNodeMessage: { @doc("The file to print the message to.") out: *FILE, @doc("The node for which the message is intended.") @@ -1622,10 +1622,10 @@ MD_ParseWholeFile: @send(Nodes) @doc("Prints a C format string message to @code 'out', corresponding with the source code location of @code 'node'.") -@see(MD_Message) -@see(MD_MessageF) -@see(MD_NodeMessage) -@func MD_NodeMessageF: { +@see(MD_PrintMessage) +@see(MD_PrintMessageFmt) +@see(MD_PrintNodeMessage) +@func MD_PrintNodeMessageFmt: { @doc("The file to print the message to.") out: *FILE, @doc("The node for which the message is intended.") @@ -1642,7 +1642,7 @@ MD_ParseWholeFile: @send(Nodes) @doc("Compares the passed MD_Node nodes @code 'a' and @code 'b', and determines whether or not they match. @code 'flags' determines the rules used in the matching algorithm, including tag-sensitivity and case-sensitivity.") -@see(MD_StringMatch) +@see(MD_S8Match) @see(MD_MatchFlags) @func MD_NodeMatch: { a: *MD_Node, @@ -1665,7 +1665,7 @@ MD_ParseWholeFile: @send(Output) @doc("Outputs a textual representation of the tree with @code 'node' as its root to @code 'file'.") -@func MD_OutputTree: { +@func MD_DebugOutputTree: { file: *FILE, node: *MD_Node, }; @@ -1675,7 +1675,7 @@ MD_ParseWholeFile: @send(CommandLineHelper) @doc("Converts a traditional C-style @code 'argc, argv' pair into an MD_String8List.") -@see(MD_CommandLineFromOptions) +@see(MD_MakeCmdLineFromOptions) @func MD_StringListFromArgCV: { @doc("The number of command line arguments. Traditionally referred to as @code 'argc'.") @@ -1688,46 +1688,46 @@ MD_ParseWholeFile: @send(CommandLineHelper) @doc("Parses an MD_String8List as a set of command line options.") @see(MD_StringListFromArgCV) -@see(MD_CommandLineOptionValues) -@see(MD_CommandLineOptionPassed) -@func MD_CommandLineFromOptions: +@see(MD_CmdLineValuesFromString) +@see(MD_CmdLineB32FromString) +@func MD_MakeCmdLineFromOptions: { options: MD_String8List; - return: MD_CommandLine; + return: MD_CmdLine; } @send(CommandLineHelper) @doc("Gets the list of values associated with @code 'name' in the parsed command line arguments.") -@see(MD_CommandLineFromOptions) -@see(MD_CommandLineOptionPassed) -@see(MD_CommandLineOptionI64) -@func MD_CommandLineOptionValues: +@see(MD_MakeCmdLineFromOptions) +@see(MD_CmdLineB32FromString) +@see(MD_CmdLineI64FromString) +@func MD_CmdLineValuesFromString: { - cmdln: MD_CommandLine; + cmdln: MD_CmdLine; name: MD_String8; return: MD_String8List; } @send(CommandLineHelper) @doc("Determines whether a command line argument explicitly passed an option matching @code 'name'.") -@see(MD_CommandLineFromOptions) -@see(MD_CommandLineOptionPassed) -@see(MD_CommandLineOptionValues) -@func MD_CommandLineOptionPassed: +@see(MD_MakeCmdLineFromOptions) +@see(MD_CmdLineB32FromString) +@see(MD_CmdLineValuesFromString) +@func MD_CmdLineB32FromString: { - cmdln: MD_CommandLine; + cmdln: MD_CmdLine; name: MD_String8; return: MD_b32; } @send(CommandLineHelper) -@see(MD_CommandLineFromOptions) -@see(MD_CommandLineOptionValues) -@see(MD_CommandLineOptionPassed) +@see(MD_MakeCmdLineFromOptions) +@see(MD_CmdLineValuesFromString) +@see(MD_CmdLineB32FromString) @doc("Gets the list of values associated with @code 'name' in the parsed command line arguments, treats them as a string representation of a 64-bit signed integer value, and returns that integer value.") -@func MD_CommandLineOptionI64: +@func MD_CmdLineI64FromString: { - cmdln: MD_CommandLine; + cmdln: MD_CmdLine; name: MD_String8; return: MD_i64; } diff --git a/intro_notes.txt b/intro_notes.txt index 8dc1d18..ab9a536 100644 --- a/intro_notes.txt +++ b/intro_notes.txt @@ -1,5 +1,5 @@ inspecting error information -MD_CodeLocFromNode, (MD_Node from MD_Error) +MD_CodeLocFromNode, (MD_Node from MD_Message) nil nodes tips on generating C concat diff --git a/samples/c_code_generation.c b/samples/c_code_generation.c index 63053df..e91b2de 100644 --- a/samples/c_code_generation.c +++ b/samples/c_code_generation.c @@ -22,7 +22,7 @@ int main(int argument_count, char **arguments) MD_Node *code = MD_ParseWholeString(MD_S8Lit("Generated Test Code"), example_code).node; printf("Source Metadesk Code:\n"); - printf("%.*s\n\n", MD_StringExpand(example_code)); + printf("%.*s\n\n", MD_S8VArg(example_code)); printf("Generated C Code:\n"); for(MD_EachNode(node, code->first_child)) diff --git a/samples/node_errors/node_errors.c b/samples/node_errors/node_errors.c index 3cb929e..5b37f38 100644 --- a/samples/node_errors/node_errors.c +++ b/samples/node_errors/node_errors.c @@ -10,16 +10,16 @@ int main(int argument_count, char **arguments) for(int i = 1; i < argument_count; i += 1) { MD_Node *root = MD_ParseWholeFile(MD_S8CString(arguments[i])).node; - MD_PushReference(list, root); + MD_PushNewReference(list, root); } // NOTE(rjf): Print errors on every single node. for(MD_EachNode(ref, list->first_child)) { - MD_Node *root = MD_Deref(ref); + MD_Node *root = MD_NodeFromReference(ref); for(MD_EachNode(node, root->first_child)) { - MD_NodeMessageF(stderr, node, MD_MessageKind_Error, "This node has an error!"); + MD_PrintNodeMessageFmt(stderr, node, MD_MessageKind_Error, "This node has an error!"); } } diff --git a/samples/old_style_custom_layer.c b/samples/old_style_custom_layer.c index 94bf130..b49e365 100644 --- a/samples/old_style_custom_layer.c +++ b/samples/old_style_custom_layer.c @@ -28,14 +28,14 @@ int main(int argument_count, char **arguments) for(int i = 1; i < argument_count; i += 1) { MD_Node *root = MD_ParseWholeFile(MD_S8CString(arguments[i])).node; - MD_PushReference(list, root); + MD_PushNewReference(list, root); } // NOTE(rjf): Call "custom layer" back. Initialize(); for(MD_EachNode(ref, list->first_child)) { - MD_Node *root = MD_Deref(ref); + MD_Node *root = MD_NodeFromReference(ref); for(MD_EachNode(node, root->first_child)) { TopLevel(node); diff --git a/samples/output_parse/examples/output/parsed_example.txt b/samples/output_parse/examples/output/parsed_example.txt index f6824a5..f8180fc 100644 --- a/samples/output_parse/examples/output/parsed_example.txt +++ b/samples/output_parse/examples/output/parsed_example.txt @@ -1,22 +1,22 @@ Node { - Kind: Label, + Kind: Main, Flags: 0000110000000001000000000000000000000000000000000000000000000000, - Flag Names: BraceLeft, BraceRight, Identifier, + Flag Names: HasBraceLeft, HasBraceRight, Identifier, String: foo, Whole String: foo, Tag: @struct Node { - Kind: Label, + Kind: Main, Flags: 1100000010000001000000000000000000000000000000000000000000000000, - Flag Names: ParenLeft, ParenRight, BeforeComma, Identifier, + Flag Names: HasParenLeft, HasParenRight, IsBeforeComma, Identifier, String: x, Whole String: x, Node { - Kind: Label, + Kind: Main, Flags: 0011000000000000000000000000000000000000000000000000000000000000, - Flag Names: BracketLeft, BracketRight, + Flag Names: HasBracketLeft, HasBracketRight, Node { - Kind: Label, + Kind: Main, Flags: 0000000000000001000000000000000000000000000000000000000000000000, Flag Names: Identifier, String: MAX_PATH, @@ -24,7 +24,7 @@ Node { } } Node { - Kind: Label, + Kind: Main, Flags: 0000000000000001000000000000000000000000000000000000000000000000, Flag Names: Identifier, String: char, @@ -34,21 +34,21 @@ Node { } Node { - Kind: Label, + Kind: Main, Flags: 0000110000000001000000000000000000000000000000000000000000000000, - Flag Names: BraceLeft, BraceRight, Identifier, + Flag Names: HasBraceLeft, HasBraceRight, Identifier, String: bar, Whole String: bar, Tag: @struct Tag: @test_tag Node { - Kind: Label, + Kind: Main, Flags: 0000000000000001000000000000000000000000000000000000000000000000, Flag Names: Identifier, String: y, Whole String: y, Node { - Kind: Label, + Kind: Main, Flags: 0000000000000001000000000000000000000000000000000000000000000000, Flag Names: Identifier, String: float, @@ -56,13 +56,13 @@ Node { } } Node { - Kind: Label, + Kind: Main, Flags: 0000000000000001000000000000000000000000000000000000000000000000, Flag Names: Identifier, String: z, Whole String: z, Node { - Kind: Label, + Kind: Main, Flags: 0000000000000001000000000000000000000000000000000000000000000000, Flag Names: Identifier, String: i32, diff --git a/samples/output_parse/examples/output/parsed_example2.txt b/samples/output_parse/examples/output/parsed_example2.txt index 2aa89b4..7c82c01 100644 --- a/samples/output_parse/examples/output/parsed_example2.txt +++ b/samples/output_parse/examples/output/parsed_example2.txt @@ -1,138 +1,138 @@ Node { - Kind: Label, + Kind: Main, Flags: 0000110000000001000000000000000000000000000000000000000000000000, - Flag Names: BraceLeft, BraceRight, Identifier, + Flag Names: HasBraceLeft, HasBraceRight, Identifier, String: a_set, Whole String: a_set, Tag: @sets Node { - Kind: Label, + Kind: Main, Flags: 0000110010000001000000000000000000000000000000000000000000000000, - Flag Names: BraceLeft, BraceRight, BeforeComma, Identifier, + Flag Names: HasBraceLeft, HasBraceRight, IsBeforeComma, Identifier, String: named_set, Whole String: named_set, Node { - Kind: Label, + Kind: Main, Flags: 0000000010000010000000000000000000000000000000000000000000000000, - Flag Names: BeforeComma, Numeric, + Flag Names: IsBeforeComma, Numeric, String: 1, Whole String: 1, } Node { - Kind: Label, + Kind: Main, Flags: 0000000011000010000000000000000000000000000000000000000000000000, - Flag Names: BeforeComma, AfterComma, Numeric, + Flag Names: IsBeforeComma, IsAfterComma, Numeric, String: 3, Whole String: 3, } Node { - Kind: Label, + Kind: Main, Flags: 0000000001000010000000000000000000000000000000000000000000000000, - Flag Names: AfterComma, Numeric, + Flag Names: IsAfterComma, Numeric, String: 7, Whole String: 7, } } Node { - Kind: Label, + Kind: Main, Flags: 0000110011000000000000000000000000000000000000000000000000000000, - Flag Names: BraceLeft, BraceRight, BeforeComma, AfterComma, + Flag Names: HasBraceLeft, HasBraceRight, IsBeforeComma, IsAfterComma, Node { - Kind: Label, + Kind: Main, Flags: 0000000010000001000000000000000000000000000000000000000000000000, - Flag Names: BeforeComma, Identifier, + Flag Names: IsBeforeComma, Identifier, String: not, Whole String: not, } Node { - Kind: Label, + Kind: Main, Flags: 0000000011000001000000000000000000000000000000000000000000000000, - Flag Names: BeforeComma, AfterComma, Identifier, + Flag Names: IsBeforeComma, IsAfterComma, Identifier, String: named, Whole String: named, } Node { - Kind: Label, + Kind: Main, Flags: 0000000001000001000000000000000000000000000000000000000000000000, - Flag Names: AfterComma, Identifier, + Flag Names: IsAfterComma, Identifier, String: set, Whole String: set, } } Node { - Kind: Label, + Kind: Main, Flags: 0000110011000000000000000000000000000000000000000000000000000000, - Flag Names: BraceLeft, BraceRight, BeforeComma, AfterComma, + Flag Names: HasBraceLeft, HasBraceRight, IsBeforeComma, IsAfterComma, Tag: @tag_with_params Tag Children{ Node { - Kind: Label, + Kind: Main, Flags: 0000000010000001000000000000000000000000000000000000000000000000, - Flag Names: BeforeComma, Identifier, + Flag Names: IsBeforeComma, Identifier, String: p1, Whole String: p1, } Node { - Kind: Label, + Kind: Main, Flags: 0000000011000001000000000000000000000000000000000000000000000000, - Flag Names: BeforeComma, AfterComma, Identifier, + Flag Names: IsBeforeComma, IsAfterComma, Identifier, String: p2, Whole String: p2, } Node { - Kind: Label, + Kind: Main, Flags: 0000000001000001000000000000000000000000000000000000000000000000, - Flag Names: AfterComma, Identifier, + Flag Names: IsAfterComma, Identifier, String: p3, Whole String: p3, } } Node { - Kind: Label, + Kind: Main, Flags: 0000000010000001000000000000000000000000000000000000000000000000, - Flag Names: BeforeComma, Identifier, + Flag Names: IsBeforeComma, Identifier, String: e1, Whole String: e1, } Node { - Kind: Label, + Kind: Main, Flags: 0000000011000001000000000000000000000000000000000000000000000000, - Flag Names: BeforeComma, AfterComma, Identifier, + Flag Names: IsBeforeComma, IsAfterComma, Identifier, String: e2, Whole String: e2, } Node { - Kind: Label, + Kind: Main, Flags: 0000000001000001000000000000000000000000000000000000000000000000, - Flag Names: AfterComma, Identifier, + Flag Names: IsAfterComma, Identifier, String: e3, Whole String: e3, } } Node { - Kind: Label, + Kind: Main, Flags: 0000110011000000000000000000000000000000000000000000000000000000, - Flag Names: BraceLeft, BraceRight, BeforeComma, AfterComma, + Flag Names: HasBraceLeft, HasBraceRight, IsBeforeComma, IsAfterComma, Tag: @tag_with_params Tag Children{ Node { - Kind: Label, + Kind: Main, Flags: 0000000010000001000000000000000000000000000000000000000000000000, - Flag Names: BeforeComma, Identifier, + Flag Names: IsBeforeComma, Identifier, String: p1, Whole String: p1, } Node { - Kind: Label, + Kind: Main, Flags: 0000000011000001000000000000000000000000000000000000000000000000, - Flag Names: BeforeComma, AfterComma, Identifier, + Flag Names: IsBeforeComma, IsAfterComma, Identifier, String: p2, Whole String: p2, } Node { - Kind: Label, + Kind: Main, Flags: 0000000001000001000000000000000000000000000000000000000000000000, - Flag Names: AfterComma, Identifier, + Flag Names: IsAfterComma, Identifier, String: p3, Whole String: p3, } @@ -140,45 +140,45 @@ Node { Tag: @tag2_with_params Tag Children{ Node { - Kind: Label, + Kind: Main, Flags: 0000000010000001000000000000000000000000000000000000000000000000, - Flag Names: BeforeComma, Identifier, + Flag Names: IsBeforeComma, Identifier, String: p, Whole String: p, } Node { - Kind: Label, + Kind: Main, Flags: 0000000011000001000000000000000000000000000000000000000000000000, - Flag Names: BeforeComma, AfterComma, Identifier, + Flag Names: IsBeforeComma, IsAfterComma, Identifier, String: pp, Whole String: pp, } Node { - Kind: Label, + Kind: Main, Flags: 0000000001000001000000000000000000000000000000000000000000000000, - Flag Names: AfterComma, Identifier, + Flag Names: IsAfterComma, Identifier, String: ppp, Whole String: ppp, } } Node { - Kind: Label, + Kind: Main, Flags: 0000000010000001000000000000000000000000000000000000000000000000, - Flag Names: BeforeComma, Identifier, + Flag Names: IsBeforeComma, Identifier, String: e1, Whole String: e1, } Node { - Kind: Label, + Kind: Main, Flags: 0000000011000001000000000000000000000000000000000000000000000000, - Flag Names: BeforeComma, AfterComma, Identifier, + Flag Names: IsBeforeComma, IsAfterComma, Identifier, String: e2, Whole String: e2, } Node { - Kind: Label, + Kind: Main, Flags: 0000000001000001000000000000000000000000000000000000000000000000, - Flag Names: AfterComma, Identifier, + Flag Names: IsAfterComma, Identifier, String: e3, Whole String: e3, } @@ -186,27 +186,27 @@ Node { } Node { - Kind: Label, + Kind: Main, Flags: 0000110000000001000000000000000000000000000000000000000000000000, - Flag Names: BraceLeft, BraceRight, Identifier, + Flag Names: HasBraceLeft, HasBraceRight, Identifier, String: empty, Whole String: empty, Tag: @empty_set } Node { - Kind: Label, + Kind: Main, Flags: 0000110000000000000000000000000000000000000000000000000000000000, - Flag Names: BraceLeft, BraceRight, + Flag Names: HasBraceLeft, HasBraceRight, Tag: @tagged_unnamed_set Node { - Kind: Label, + Kind: Main, Flags: 0000110000000001000000000000000000000000000000000000000000000000, - Flag Names: BraceLeft, BraceRight, Identifier, + Flag Names: HasBraceLeft, HasBraceRight, Identifier, String: a_label, Whole String: a_label, Node { - Kind: Label, + Kind: Main, Flags: 0000000000000001000000000000000000000000000000000000000000000000, Flag Names: Identifier, String: unnamed_set_element, @@ -216,33 +216,33 @@ Node { } Node { - Kind: Label, + Kind: Main, Flags: 0000110000000000000000000000000000000000000000000000000000000000, - Flag Names: BraceLeft, BraceRight, + Flag Names: HasBraceLeft, HasBraceRight, Tag: @showcase_mixed_set_scoping Node { - Kind: Label, + Kind: Main, Flags: 1001000010000000000000000000000000000000000000000000000000000000, - Flag Names: ParenLeft, BracketRight, BeforeComma, + Flag Names: HasParenLeft, HasBracketRight, IsBeforeComma, String: +, Whole String: +, Tag: @symbol_label Node { - Kind: Label, + Kind: Main, Flags: 0000000000000010000000000000000000000000000000000000000000000000, Flag Names: Numeric, String: 1, Whole String: 1, } Node { - Kind: Label, + Kind: Main, Flags: 0000000000000010000000000000000000000000000000000000000000000000, Flag Names: Numeric, String: 2, Whole String: 2, } Node { - Kind: Label, + Kind: Main, Flags: 0000000000000010000000000000000000000000000000000000000000000000, Flag Names: Numeric, String: 3, @@ -250,28 +250,28 @@ Node { } } Node { - Kind: Label, + Kind: Main, Flags: 0110000011000000000000000000000000000000000000000000000000000000, - Flag Names: ParenRight, BracketLeft, BeforeComma, AfterComma, + Flag Names: HasParenRight, HasBracketLeft, IsBeforeComma, IsAfterComma, String: *, Whole String: *, Tag: @symbol_label Node { - Kind: Label, + Kind: Main, Flags: 0000000000000001000000000000000000000000000000000000000000000000, Flag Names: Identifier, String: x, Whole String: x, } Node { - Kind: Label, + Kind: Main, Flags: 0000000000000001000000000000000000000000000000000000000000000000, Flag Names: Identifier, String: y, Whole String: y, } Node { - Kind: Label, + Kind: Main, Flags: 0000000000000001000000000000000000000000000000000000000000000000, Flag Names: Identifier, String: z, diff --git a/samples/output_parse/output_parse.c b/samples/output_parse/output_parse.c index 95dd903..5136b71 100644 --- a/samples/output_parse/output_parse.c +++ b/samples/output_parse/output_parse.c @@ -16,7 +16,7 @@ static void Print(FILE* file, int indent_count, char* fmt, ...) { static void PrintNode(MD_Node* node, FILE* file, int indent_count) { Print(file, indent_count, "Node {\n"); - Print(file, indent_count+1, "Kind: %.*s,\n", MD_StringExpand(MD_StringFromNodeKind(node->kind))); + Print(file, indent_count+1, "Kind: %.*s,\n", MD_S8VArg(MD_StringFromNodeKind(node->kind))); int flags_bits = sizeof(node->flags)*8; char binary_flags[sizeof(node->flags)*8+1]; @@ -32,14 +32,14 @@ static void PrintNode(MD_Node* node, FILE* file, int indent_count) { Print(file, indent_count+1, "Flags: %s,\n", binary_flags); Print(file, indent_count+1, "Flag Names: ", binary_flags); MD_String8List flags_list = MD_StringListFromNodeFlags(node->flags); - MD_String8 flag_names = MD_JoinStringList(flags_list, MD_S8CString(", ")); - fprintf(file, "%.*s,\n", MD_StringExpand(flag_names)); + MD_String8 flag_names = MD_S8ListJoin(flags_list, MD_S8CString(", ")); + fprintf(file, "%.*s,\n", MD_S8VArg(flag_names)); - if(node->string.size > 0) Print(file, indent_count+1, "String: %.*s,\n", MD_StringExpand(node->string)); - if(node->whole_string.size > 0) Print(file, indent_count+1, "Whole String: %.*s,\n", MD_StringExpand(node->whole_string)); + if(node->string.size > 0) Print(file, indent_count+1, "String: %.*s,\n", MD_S8VArg(node->string)); + if(node->raw_string.size > 0) Print(file, indent_count+1, "Whole String: %.*s,\n", MD_S8VArg(node->raw_string)); if (node->first_tag->kind != MD_NodeKind_Nil) { for (MD_EachNode(tag, node->first_tag)) { - Print(file, indent_count+1, "Tag: @%.*s\n", MD_StringExpand(tag->string)); + Print(file, indent_count+1, "Tag: @%.*s\n", MD_S8VArg(tag->string)); if (tag->first_child->kind != MD_NodeKind_Nil) { Print(file, indent_count+2, "Tag Children{\n"); for (MD_EachNode(arg, tag->first_child)) { @@ -63,15 +63,15 @@ int main(int argument_count, char **arguments) for(int i = 1; i < argument_count; i += 1) { MD_Node *root = MD_ParseWholeFile(MD_S8CString(arguments[i])).node; - MD_PushReference(list, root); + MD_PushNewReference(list, root); } for(MD_EachNode(ref, list->first_child)) { - MD_Node *root = MD_Deref(ref); - MD_String8 code_filename = MD_ChopExtension(MD_SkipFolder(root->string)); - MD_String8 info_filename = MD_PushStringF("parsed_%.*s.txt", MD_StringExpand(code_filename)); - printf("Parse Input -> Output: %.*s -> %.*s\n", MD_StringExpand(code_filename), MD_StringExpand(info_filename)); + MD_Node *root = MD_NodeFromReference(ref); + MD_String8 code_filename = MD_PathChopLastPeriod(MD_PathSkipLastSlash(root->string)); + MD_String8 info_filename = MD_S8Fmt("parsed_%.*s.txt", MD_S8VArg(code_filename)); + printf("Parse Input -> Output: %.*s -> %.*s\n", MD_S8VArg(code_filename), MD_S8VArg(info_filename)); FILE* file = fopen((char *)info_filename.str, "wb"); for(MD_EachNode(node, root->first_child)) diff --git a/samples/parse_check.c b/samples/parse_check.c index b9386c7..e8c2d78 100644 --- a/samples/parse_check.c +++ b/samples/parse_check.c @@ -7,14 +7,14 @@ int main(int argument_count, char **arguments) for(int i = 1; i < argument_count; i += 1) { MD_Node *root = MD_ParseWholeFile(MD_S8CString(arguments[i])).node; - MD_PushReference(list, root); + MD_PushNewReference(list, root); } for(MD_EachNodeRef(root, list->first_child)) { for(MD_EachNode(node, root->first_child)) { - MD_OutputTree(stdout, node, 0); + MD_DebugOutputTree(stdout, node, 0); } } diff --git a/samples/static_site_generator/example_site/generated/blog1.html b/samples/static_site_generator/example_site/generated/blog1.html index ec66352..ea7006b 100644 --- a/samples/static_site_generator/example_site/generated/blog1.html +++ b/samples/static_site_generator/example_site/generated/blog1.html @@ -26,18 +26,15 @@
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse ut ornare neque, vitae finibus leo. Praesent pulvinar, urna id lobortis iaculis, velit turpis luctus tortor, quis malesuada neque neque vitae turpis. Phasellus id molestie elit. Sed elementum ipsum a ligula semper, at varius augue rutrum. Pellentesque fringilla, orci nec fringilla finibus, turpis lacus vehicula elit, nec bibendum magna est quis massa. Aliquam efficitur facilisis nibh, ut sodales sapien scelerisque nec. Integer justo sem, pellentesque et ante imperdiet, interdum placerat sem. - -Nunc hendrerit lobortis commodo. Morbi felis quam, fermentum vitae libero vitae, fermentum sodales quam. Nulla bibendum tellus quis lorem sollicitudin pretium. Etiam commodo ex eget aliquet porta. In sit amet dui eleifend, mattis sem nec, tristique erat. Morbi malesuada fringilla bibendum. Integer odio ex, cursus a sodales quis, vehicula non dolor. - -Praesent vitae pharetra felis. Curabitur non ex non nunc pretium feugiat eu sit amet turpis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean blandit ante leo. Vivamus iaculis mi vel sem tincidunt maximus. Aenean elementum ipsum non laoreet semper. Morbi non felis interdum lectus pulvinar mollis id non purus. Nullam eu ipsum ut turpis aliquam feugiat at non tellus. Suspendisse ornare erat quis enim ullamcorper, at rhoncus nulla suscipit. +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse ut ornare neque, vitae finibus leo. Praesent pulvinar, urna id lobortis iaculis, velit turpis luctus tortor, quis malesuada neque neque vitae turpis. Phasellus id molestie elit. Sed elementum ipsum a ligula semper, at varius augue rutrum. Pellentesque fringilla, orci nec fringilla finibus, turpis lacus vehicula elit, nec bibendum magna est quis massa. Aliquam efficitur facilisis nibh, ut sodales sapien scelerisque nec. Integer justo sem, pellentesque et ante imperdiet, interdum placerat sem.
+Nunc hendrerit lobortis commodo. Morbi felis quam, fermentum vitae libero vitae, fermentum sodales quam. Nulla bibendum tellus quis lorem sollicitudin pretium. Etiam commodo ex eget aliquet porta. In sit amet dui eleifend, mattis sem nec, tristique erat. Morbi malesuada fringilla bibendum. Integer odio ex, cursus a sodales quis, vehicula non dolor.
+Praesent vitae pharetra felis. Curabitur non ex non nunc pretium feugiat eu sit amet turpis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean blandit ante leo. Vivamus iaculis mi vel sem tincidunt maximus. Aenean elementum ipsum non laoreet semper. Morbi non felis interdum lectus pulvinar mollis id non purus. Nullam eu ipsum ut turpis aliquam feugiat at non tellus. Suspendisse ornare erat quis enim ullamcorper, at rhoncus nulla suscipit.

-Aliquam quis diam at sem interdum imperdiet. Nunc imperdiet ligula tempus nibh semper mattis. Suspendisse fringilla molestie semper. Sed felis dolor, vehicula et tempus sed, porttitor finibus lacus. Pellentesque egestas ex finibus, facilisis tellus suscipit, accumsan turpis. Ut imperdiet vitae nisl eget vestibulum. Donec eu bibendum erat, id maximus magna. Vivamus quis rhoncus justo. Morbi eget commodo lorem, vulputate varius ipsum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer accumsan, sem vel rutrum cursus, odio enim sodales leo, sit amet rutrum odio purus at nisi. Fusce iaculis ante id nunc volutpat tincidunt. Duis nec tincidunt ipsum. Fusce vitae odio ac velit sollicitudin maximus. Vestibulum ante dui, varius auctor ante eu, gravida laoreet justo. - -Vivamus dignissim mauris nec turpis convallis, vitae pellentesque sapien faucibus. Phasellus eu euismod elit, sit amet vehicula diam. Curabitur sit amet leo magna. In est erat, congue vel euismod id, venenatis vitae mauris. Vestibulum sit amet leo eget leo ornare feugiat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vivamus at efficitur ex, a mattis lorem. Maecenas blandit tincidunt tortor vel cursus. In in purus a nisi pretium venenatis in ut lacus. Maecenas venenatis rutrum laoreet. Donec aliquam leo vel risus cursus, placerat pretium lacus fringilla. Suspendisse ut porttitor mauris. +Aliquam quis diam at sem interdum imperdiet. Nunc imperdiet ligula tempus nibh semper mattis. Suspendisse fringilla molestie semper. Sed felis dolor, vehicula et tempus sed, porttitor finibus lacus. Pellentesque egestas ex finibus, facilisis tellus suscipit, accumsan turpis. Ut imperdiet vitae nisl eget vestibulum. Donec eu bibendum erat, id maximus magna. Vivamus quis rhoncus justo. Morbi eget commodo lorem, vulputate varius ipsum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer accumsan, sem vel rutrum cursus, odio enim sodales leo, sit amet rutrum odio purus at nisi. Fusce iaculis ante id nunc volutpat tincidunt. Duis nec tincidunt ipsum. Fusce vitae odio ac velit sollicitudin maximus. Vestibulum ante dui, varius auctor ante eu, gravida laoreet justo.
+Vivamus dignissim mauris nec turpis convallis, vitae pellentesque sapien faucibus. Phasellus eu euismod elit, sit amet vehicula diam. Curabitur sit amet leo magna. In est erat, congue vel euismod id, venenatis vitae mauris. Vestibulum sit amet leo eget leo ornare feugiat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vivamus at efficitur ex, a mattis lorem. Maecenas blandit tincidunt tortor vel cursus. In in purus a nisi pretium venenatis in ut lacus. Maecenas venenatis rutrum laoreet. Donec aliquam leo vel risus cursus, placerat pretium lacus fringilla. Suspendisse ut porttitor mauris.
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse ut ornare neque, vitae finibus leo. Praesent pulvinar, urna id lobortis iaculis, velit turpis luctus tortor, quis malesuada neque neque vitae turpis. Phasellus id molestie elit. Sed elementum ipsum a ligula semper, at varius augue rutrum. Pellentesque fringilla, orci nec fringilla finibus, turpis lacus vehicula elit, nec bibendum magna est quis massa. Aliquam efficitur facilisis nibh, ut sodales sapien scelerisque nec. Integer justo sem, pellentesque et ante imperdiet, interdum placerat sem. - -Nunc hendrerit lobortis commodo. Morbi felis quam, fermentum vitae libero vitae, fermentum sodales quam. Nulla bibendum tellus quis lorem sollicitudin pretium. Etiam commodo ex eget aliquet porta. In sit amet dui eleifend, mattis sem nec, tristique erat. Morbi malesuada fringilla bibendum. Integer odio ex, cursus a sodales quis, vehicula non dolor. - -Praesent vitae pharetra felis. Curabitur non ex non nunc pretium feugiat eu sit amet turpis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean blandit ante leo. Vivamus iaculis mi vel sem tincidunt maximus. Aenean elementum ipsum non laoreet semper. Morbi non felis interdum lectus pulvinar mollis id non purus. Nullam eu ipsum ut turpis aliquam feugiat at non tellus. Suspendisse ornare erat quis enim ullamcorper, at rhoncus nulla suscipit. +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse ut ornare neque, vitae finibus leo. Praesent pulvinar, urna id lobortis iaculis, velit turpis luctus tortor, quis malesuada neque neque vitae turpis. Phasellus id molestie elit. Sed elementum ipsum a ligula semper, at varius augue rutrum. Pellentesque fringilla, orci nec fringilla finibus, turpis lacus vehicula elit, nec bibendum magna est quis massa. Aliquam efficitur facilisis nibh, ut sodales sapien scelerisque nec. Integer justo sem, pellentesque et ante imperdiet, interdum placerat sem.
+Nunc hendrerit lobortis commodo. Morbi felis quam, fermentum vitae libero vitae, fermentum sodales quam. Nulla bibendum tellus quis lorem sollicitudin pretium. Etiam commodo ex eget aliquet porta. In sit amet dui eleifend, mattis sem nec, tristique erat. Morbi malesuada fringilla bibendum. Integer odio ex, cursus a sodales quis, vehicula non dolor.
+Praesent vitae pharetra felis. Curabitur non ex non nunc pretium feugiat eu sit amet turpis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean blandit ante leo. Vivamus iaculis mi vel sem tincidunt maximus. Aenean elementum ipsum non laoreet semper. Morbi non felis interdum lectus pulvinar mollis id non purus. Nullam eu ipsum ut turpis aliquam feugiat at non tellus. Suspendisse ornare erat quis enim ullamcorper, at rhoncus nulla suscipit.
