1 /*****************************************************************************/ 2 /* */ 3 /* attr.h */ 4 /* */ 5 /* Command line attributes */ 6 /* */ 7 /* */ 8 /* */ 9 /* (C) 2012, Ullrich von Bassewitz */ 10 /* Roemerstrasse 52 */ 11 /* D-70794 Filderstadt */ 12 /* EMail: uz@cc65.org */ 13 /* */ 14 /* */ 15 /* This software is provided 'as-is', without any expressed or implied */ 16 /* warranty. In no event will the authors be held liable for any damages */ 17 /* arising from the use of this software. */ 18 /* */ 19 /* Permission is granted to anyone to use this software for any purpose, */ 20 /* including commercial applications, and to alter it and redistribute it */ 21 /* freely, subject to the following restrictions: */ 22 /* */ 23 /* 1. The origin of this software must not be misrepresented; you must not */ 24 /* claim that you wrote the original software. If you use this software */ 25 /* in a product, an acknowledgment in the product documentation would be */ 26 /* appreciated but is not required. */ 27 /* 2. Altered source versions must be plainly marked as such, and must not */ 28 /* be misrepresented as being the original software. */ 29 /* 3. This notice may not be removed or altered from any source */ 30 /* distribution. */ 31 /* */ 32 /*****************************************************************************/ 33 34 35 36 #ifndef ATTRCOLL_H 37 #define ATTRCOLL_H 38 39 40 41 /* common */ 42 #include "coll.h" 43 44 45 46 /*****************************************************************************/ 47 /* Data */ 48 /*****************************************************************************/ 49 50 51 52 /* Attribute structure */ 53 typedef struct Attr Attr; 54 struct Attr { 55 char* Name; /* Attribute name - points into Value */ 56 char Value[1]; /* Attribute value followed by Name */ 57 }; 58 59 60 61 /*****************************************************************************/ 62 /* Code */ 63 /*****************************************************************************/ 64 65 66 67 Attr* NewAttr (const char* Name, const char* Value); 68 /* Create a new attribute */ 69 70 void FreeAttr (Attr* A); 71 /* Free an attribute structure */ 72 73 void DumpAttrColl (const Collection* C); 74 /* Dump a collection of attribute/value pairs for debugging */ 75 76 int FindAttr (const Collection* C, const char* Name, unsigned* Index); 77 /* Search for an attribute with the given name in the collection. If it is 78 ** found, the function returns true and Index contains the index of the 79 ** entry. If Name isn't found, the function returns false and Index 80 ** will contain the insert position. 81 */ 82 83 const Attr* GetAttr (const Collection* C, const char* Name); 84 /* Search for an attribute with the given name and return it. The function 85 ** returns NULL if the attribute wasn't found. 86 */ 87 88 const Attr* NeedAttr (const Collection* C, const char* Name, const char* Op); 89 /* Search for an attribute with the given name and return it. If the attribute 90 ** is not found, the function terminates with an error using Op as additional 91 ** context in the error message. 92 */ 93 94 const char* GetAttrVal (const Collection* C, const char* Name); 95 /* Search for an attribute with the given name and return its value. The 96 ** function returns NULL if the attribute wasn't found. 97 */ 98 99 const char* NeedAttrVal (const Collection* C, const char* Name, const char* Op); 100 /* Search for an attribute with the given name and return its value. If the 101 ** attribute wasn't not found, the function terminates with an error using 102 ** Op as additional context in the error message. 103 */ 104 105 void AddAttr (Collection* C, const char* Name, const char* Value); 106 /* Add an attribute to an alphabetically sorted attribute collection */ 107 108 void SplitAddAttr (Collection* C, const char* Combined, const char* Name); 109 /* Split a combined name/value pair and add it as an attribute to C. Some 110 ** attributes may not need a name. If the name is missing, use Name. If 111 ** Name is NULL, terminate with an error. 112 */ 113 114 Collection* ParseAttrList (const char* List, const char* const* NameList, unsigned NameCount); 115 /* Parse a list containing name/value pairs into a sorted collection. Some 116 ** attributes may not need a name, so NameList contains these names. If there 117 ** were no errors, the function returns a alphabetically sorted collection 118 ** containing Attr entries. 119 */ 120 121 void FreeAttrList (Collection* C); 122 /* Free a list of attributes */ 123 124 125 126 /* End of attr.h */ 127 128 #endif 129