Rev 378 | Rev 488 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 378 | Rev 465 | ||
---|---|---|---|
1 | #!/usr/bin/php |
1 | #!/usr/bin/php |
2 | <?php |
2 | <?php |
3 | 3 | ||
4 | /* |
4 | /* |
5 | This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop |
5 | This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop |
6 | Copyright (C) 2003-2009 Toby Thain, toby@telegraphics.com.au |
6 | Copyright (C) 2003-2009 Toby Thain, toby@telegraphics.com.au |
7 | Copyright (C) 2018-2021 Daniel Marschall, ViaThinkSoft |
7 | Copyright (C) 2018-2021 Daniel Marschall, ViaThinkSoft |
8 | 8 | ||
9 | This program is free software; you can redistribute it and/or modify |
9 | This program is free software; you can redistribute it and/or modify |
10 | it under the terms of the GNU General Public License as published by |
10 | it under the terms of the GNU General Public License as published by |
11 | the Free Software Foundation; either version 2 of the License, or |
11 | the Free Software Foundation; either version 2 of the License, or |
12 | (at your option) any later version. |
12 | (at your option) any later version. |
13 | 13 | ||
14 | This program is distributed in the hope that it will be useful, |
14 | This program is distributed in the hope that it will be useful, |
15 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | GNU General Public License for more details. |
17 | GNU General Public License for more details. |
18 | 18 | ||
19 | You should have received a copy of the GNU General Public License |
19 | You should have received a copy of the GNU General Public License |
20 | along with this program; if not, write to the Free Software |
20 | along with this program; if not, write to the Free Software |
21 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
21 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
22 | */ |
22 | */ |
23 | 23 | ||
24 | // This script generates the documentation file os_types.md |
24 | // This script generates the documentation file os_types.md |
25 | 25 | ||
26 | define('DESC_WIDTH', 55); |
26 | define('DESC_WIDTH', 55); |
27 | define('VENDOR_WIDTH', 15); |
27 | define('VENDOR_WIDTH', 15); |
28 | 28 | ||
29 | ob_start(); |
29 | ob_start(); |
30 | 30 | ||
31 | echo "OSTypes used in Filter Foundry\n"; |
31 | echo "OSTypes used in Filter Foundry\n"; |
32 | echo "==============================\n"; |
32 | echo "==============================\n"; |
33 | echo "\n"; |
33 | echo "\n"; |
34 | 34 | ||
35 | echo "Note: According to the Photoshop API guide:\n"; |
35 | echo "Note: According to the Photoshop API guide:\n"; |
36 | echo "- All IDs starting with an uppercase letter are reserved by Adobe.\n"; |
36 | echo "- All IDs starting with an uppercase letter are reserved by Adobe.\n"; |
37 | echo "- All IDs that are all uppercase are reserved by Apple.\n"; |
37 | echo "- All IDs that are all uppercase are reserved by Apple.\n"; |
38 | echo "- All IDs that are all lowercase are reserved by Apple.\n"; |
38 | echo "- All IDs that are all lowercase are reserved by Apple.\n"; |
39 | echo "- This leaves all IDs that begin with a lowercase letter and have at least\n"; |
39 | echo "- This leaves all IDs that begin with a lowercase letter and have at least\n"; |
40 | echo " one uppercase letter for you and other plug-in developers.\n"; |
40 | echo " one uppercase letter for you and other plug-in developers.\n"; |
41 | echo "\n"; |
41 | echo "\n"; |
42 | 42 | ||
43 | # ------------------------------------------------------------------------------ |
43 | # ------------------------------------------------------------------------------ |
44 | 44 | ||
45 | ostype_header("AppleScript related"); |
45 | ostype_header("AppleScript related"); |
46 | ostype_info('tELE', 'Plugin Suite ID', 'Telegraphics'); |
46 | ostype_info('tELE', 'Plugin Suite ID', 'Telegraphics'); |
47 | ostype_info('Fltr', 'Class ID "Filter" (PITerminology.h:eventFilter)', 'Adobe'); |
47 | ostype_info('Fltr', 'Class ID "Filter" (PITerminology.h:eventFilter)', 'Adobe'); |
48 | ostype_info('fiFo', 'Event ID (for non-standalone filter)', 'Telegraphics'); |
48 | ostype_info('fiFo', 'Event ID (for non-standalone filter)', 'Telegraphics'); |
49 | ostype_info('xprR', 'Expression "red" channel (for non-standalone filter)', 'Telegraphics'); |
49 | ostype_info('xprR', 'Expression "red" channel (for non-standalone filter)', 'Telegraphics'); |
50 | ostype_info('xprG', 'Expression "green" channel (for non-standalone filter)', 'Telegraphics'); |
50 | ostype_info('xprG', 'Expression "green" channel (for non-standalone filter)', 'Telegraphics'); |
51 | ostype_info('xprB', 'Expression "blue" channel (for non-standalone filter)', 'Telegraphics'); |
51 | ostype_info('xprB', 'Expression "blue" channel (for non-standalone filter)', 'Telegraphics'); |
52 | ostype_info('xprA', 'Expression "alpha" channel (for non-standalone filter)', 'Telegraphics'); |
52 | ostype_info('xprA', 'Expression "alpha" channel (for non-standalone filter)', 'Telegraphics'); |
53 | ostype_info('cTl0', 'Slider 0 (for non-standalone filter)', 'Telegraphics'); |
53 | ostype_info('cTl0', 'Slider 0 (for non-standalone filter)', 'Telegraphics'); |
54 | ostype_info('cTl1', 'Slider 1 (for non-standalone filter)', 'Telegraphics'); |
54 | ostype_info('cTl1', 'Slider 1 (for non-standalone filter)', 'Telegraphics'); |
55 | ostype_info('cTl2', 'Slider 2 (for non-standalone filter)', 'Telegraphics'); |
55 | ostype_info('cTl2', 'Slider 2 (for non-standalone filter)', 'Telegraphics'); |
56 | ostype_info('cTl3', 'Slider 3 (for non-standalone filter)', 'Telegraphics'); |
56 | ostype_info('cTl3', 'Slider 3 (for non-standalone filter)', 'Telegraphics'); |
57 | ostype_info('cTl4', 'Slider 4 (for non-standalone filter)', 'Telegraphics'); |
57 | ostype_info('cTl4', 'Slider 4 (for non-standalone filter)', 'Telegraphics'); |
58 | ostype_info('cTl5', 'Slider 5 (for non-standalone filter)', 'Telegraphics'); |
58 | ostype_info('cTl5', 'Slider 5 (for non-standalone filter)', 'Telegraphics'); |
59 | ostype_info('cTl6', 'Slider 6 (for non-standalone filter)', 'Telegraphics'); |
59 | ostype_info('cTl6', 'Slider 6 (for non-standalone filter)', 'Telegraphics'); |
60 | ostype_info('cTl7', 'Slider 7 (for non-standalone filter)', 'Telegraphics'); |
60 | ostype_info('cTl7', 'Slider 7 (for non-standalone filter)', 'Telegraphics'); |
61 | ostype_footer(); |
61 | ostype_footer(); |
62 | 62 | ||
63 | echo "Note: For standalone plugins, all FourCC codes above will be replaced "; |
63 | echo "Note: For standalone plugins, all FourCC codes above will be replaced "; |
64 | echo "by different hashes based on the parameter data of the filter (except `tELE` and `Fltr`).\n\n"; |
64 | echo "by different hashes based on the parameter data of the filter (except `tELE` and `Fltr`).\n\n"; |
65 | 65 | ||
66 | // TODO: also display Windows types, e.g. RT_RCDATA = 'DATA' ? |
66 | // TODO: also display Windows types, e.g. RT_RCDATA = 'DATA' ? |
67 | ostype_header("Resource fork types"); |
67 | ostype_header("Resource fork types"); |
68 | ostype_info('aete', 'Apple Event Terminology', 'Apple'); // https://developer.apple.com/library/archive/documentation/mac/pdf/Interapplication_Communication/AE_Term_Resources.pdf |
68 | ostype_info('aete', 'Apple Event Terminology', 'Apple'); // https://developer.apple.com/library/archive/documentation/mac/pdf/Interapplication_Communication/AE_Term_Resources.pdf |
69 | //ostype_info('PiMI', 'Plug-in Meta Information', 'Adobe'); |
69 | //ostype_info('PiMI', 'Plug-in Meta Information', 'Adobe'); |
70 | ostype_info('PiPL', 'PlugIn Property List', 'Adobe'); |
70 | ostype_info('PiPL', 'PlugIn Property List', 'Adobe'); |
71 | ostype_info('DATA', 'Generic data (replaced by `tpLT` and `obFS`)', '?'); |
71 | ostype_info('DATA', 'Generic data (replaced by `tpLT` and `obFS`)', '?'); |
72 | ostype_info('tpLT', 'Template for standalone filter resources', 'Telegraphics'); // actually defined by ViaThinkSoft for Filter Foundry |
72 | ostype_info('tpLT', 'Template for standalone filter resources', 'Telegraphics'); // actually defined by ViaThinkSoft for Filter Foundry |
73 | ostype_info('obFS', 'Filter Foundry obfuscated data', 'Telegraphics'); // actually defined by ViaThinkSoft |
73 | ostype_info('obFS', 'Filter Foundry obfuscated data', 'Telegraphics'); // actually defined by ViaThinkSoft |
74 | ostype_info('PARM', 'Filter Factory parameter data (PARM.h)', 'Adobe'); |
74 | ostype_info('PARM', 'Filter Factory parameter data (PARM.h)', 'Adobe'); |
75 | // https://developer.apple.com/library/archive/documentation/mac/pdf/ResEditReference.pdf |
75 | // https://developer.apple.com/library/archive/documentation/mac/pdf/ResEditReference.pdf |
76 | // https://developer.apple.com/library/archive/documentation/mac/pdf/MoreMacintoshToolbox.pdf |
76 | // https://developer.apple.com/library/archive/documentation/mac/pdf/MoreMacintoshToolbox.pdf |
77 | ostype_info('ALRT', 'Alert (only Macintosh build)', 'Apple'); |
77 | ostype_info('ALRT', 'Alert (only Macintosh build)', 'Apple'); |
78 | ostype_info('DITL', 'Dialog template (only Macintosh build)', 'Apple'); |
78 | ostype_info('DITL', 'Dialog template (only Macintosh build)', 'Apple'); |
79 | ostype_info('CNTL', 'Control (only Macintosh build)', 'Apple'); |
79 | ostype_info('CNTL', 'Control (only Macintosh build)', 'Apple'); |
80 | ostype_info('DLOG', 'Dialog (only Macintosh build)', 'Apple'); |
80 | ostype_info('DLOG', 'Dialog (only Macintosh build)', 'Apple'); |
81 | ostype_info('dlgx', 'Extended Dialog (only Macintosh build)', 'Apple'); |
81 | ostype_info('dlgx', 'Extended Dialog (only Macintosh build)', 'Apple'); |
82 | ostype_info('dftb', 'Dialog Font Table (only Macintosh build)', 'Apple'); |
82 | ostype_info('dftb', 'Dialog Font Table (only Macintosh build)', 'Apple'); |
83 | ostype_info('PICT', 'Picture (only Macintosh build)', 'Apple'); |
83 | ostype_info('PICT', 'Picture (only Macintosh build)', 'Apple'); |
84 | ostype_info('CURS', 'Cursor (only Macintosh build)', 'Apple'); |
84 | ostype_info('CURS', 'Cursor (only Macintosh build)', 'Apple'); |
85 | ostype_info('vers', 'Version number (only Macintosh build)', 'Apple'); |
85 | ostype_info('vers', 'Version number (only Macintosh build)', 'Apple'); |
86 | ostype_footer(); |
86 | ostype_footer(); |
87 | 87 | ||
88 | ostype_header("Creator codes"); |
88 | ostype_header("Creator codes"); |
89 | ostype_info('8BIM', 'Adobe Photoshop', 'Adobe'); |
89 | ostype_info('8BIM', 'Adobe Photoshop', 'Adobe'); |
90 | ostype_info('8BFM', 'Adobe Filter module (used in `kind` PiPL property)', 'Adobe'); |
90 | ostype_info('8BFM', 'Adobe Filter module (used in `kind` PiPL property)', 'Adobe'); |
91 | ostype_footer(); |
91 | ostype_footer(); |
92 | 92 | ||
93 | pipl_property_header("PlugIn Property List (PiPL) properties"); |
93 | pipl_property_header("PlugIn Property List (PiPL) properties"); |
94 | pipl_property_info('8BIM', 'catg', 'PiPL property "Category"', 'Adobe'); |
94 | pipl_property_info('8BIM', 'catg', 'PiPL property "Category"', 'Adobe'); |
95 | pipl_property_info('8BIM', 'name', 'PiPL property "Name"', 'Adobe'); |
95 | pipl_property_info('8BIM', 'name', 'PiPL property "Name"', 'Adobe'); |
96 | pipl_property_info('8BIM', 'hstm', 'PiPL property "Has terminology"', 'Adobe'); |
96 | pipl_property_info('8BIM', 'hstm', 'PiPL property "Has terminology"', 'Adobe'); |
97 | pipl_property_info('8BIM', 'wx86', 'PiPL property PIWin32X86CodeProperty (PIGeneral.h)', 'Adobe'); |
97 | pipl_property_info('8BIM', 'wx86', 'PiPL property PIWin32X86CodeProperty (PIGeneral.h)', 'Adobe'); |
98 | pipl_property_info('8BIM', '8664', 'PiPL property PIWin64X86CodeProperty (PIGeneral.h)', 'Adobe'); |
98 | pipl_property_info('8BIM', '8664', 'PiPL property PIWin64X86CodeProperty (PIGeneral.h)', 'Adobe'); |
99 | pipl_property_info('8BIM', 'kind', 'PiPL property "Kind" (PIPL.r)', 'Adobe'); |
99 | pipl_property_info('8BIM', 'kind', 'PiPL property "Kind" (PIPL.r)', 'Adobe'); |
100 | pipl_property_info('8BIM', 'vers', 'PiPL property "Version" (PIPL.r)', 'Adobe'); |
100 | pipl_property_info('8BIM', 'vers', 'PiPL property "Version" (PIPL.r)', 'Adobe'); |
101 | pipl_property_info('8BIM', 'mode', 'PiPL property "SupportedModes" (PIPL.r)', 'Adobe'); |
101 | pipl_property_info('8BIM', 'mode', 'PiPL property "SupportedModes" (PIPL.r)', 'Adobe'); |
102 | pipl_property_info('8BIM', 'ms32', 'PiPL property "PlugInMaxSize" (PIPL.r)', 'Adobe'); |
102 | pipl_property_info('8BIM', 'ms32', 'PiPL property "PlugInMaxSize" (PIPL.r)', 'Adobe'); |
103 | pipl_property_info('8BIM', 'fici', 'PiPL property "FilterCaseInfo" (PIPL.r)', 'Adobe'); |
103 | pipl_property_info('8BIM', 'fici', 'PiPL property "FilterCaseInfo" (PIPL.r)', 'Adobe'); |
104 | pipl_property_footer(); |
104 | pipl_property_footer(); |
105 | 105 | ||
106 | # ------------------------------------------------------------------------------ |
106 | # ------------------------------------------------------------------------------ |
107 | 107 | ||
108 | $out = ob_get_contents(); |
108 | $out = ob_get_contents(); |
109 | ob_end_clean(); |
109 | ob_end_clean(); |
110 | 110 | ||
111 | echo $out; |
111 | echo $out; |
112 | 112 | ||
113 | file_put_contents(__DIR__.'/os_types.md', $out); |
113 | file_put_contents(__DIR__.'/os_types.md', $out); |
114 | 114 | ||
115 | # ------------------------------------------------------------------------------ |
115 | # ------------------------------------------------------------------------------ |
116 | 116 | ||
117 | function ostype_info($type, $desc, $vendor) { |
117 | function ostype_info($type, $desc, $vendor) { |
118 | $dec = 0; |
118 | $dec = 0; |
119 | for ($i=0;$i<4;$i++) $dec = ($dec<<8) + ord($type[$i]); |
119 | for ($i=0;$i<4;$i++) $dec = ($dec<<8) + ord($type[$i]); |
120 | $hex = "0x".str_pad(dechex($dec), 8, "0", STR_PAD_LEFT); |
120 | $hex = "0x".str_pad(dechex($dec), 8, "0", STR_PAD_LEFT); |
121 | $dec = str_pad($dec, strlen(hexdec('ffffffff')), " ", STR_PAD_LEFT); |
121 | $dec = str_pad((string)$dec, strlen((string)hexdec('ffffffff')), " ", STR_PAD_LEFT); |
122 | $desc = str_pad($desc, DESC_WIDTH, " ", STR_PAD_RIGHT); |
122 | $desc = str_pad($desc, DESC_WIDTH, " ", STR_PAD_RIGHT); |
123 | 123 | ||
124 | $illegal = false; |
124 | $illegal = false; |
125 | if ($vendor != '?') { |
125 | if ($vendor != '?') { |
126 | $is_all_uppercase = strtoupper($type) == $type; |
126 | $is_all_uppercase = strtoupper($type) == $type; |
127 | $is_all_lowercase = strtolower($type) == $type; |
127 | $is_all_lowercase = strtolower($type) == $type; |
128 | $starts_with_uppercase = strtoupper($type[0]) == $type[0]; |
128 | $starts_with_uppercase = strtoupper($type[0]) == $type[0]; |
129 | if (($is_all_uppercase || $is_all_lowercase) && (strpos($vendor,'Apple') === false)) $illegal = true; |
129 | if (($is_all_uppercase || $is_all_lowercase) && (strpos($vendor,'Apple') === false)) $illegal = true; |
130 | else if (!($is_all_uppercase || $is_all_lowercase) && (strpos($vendor,'Apple') !== false)) $illegal = true; |
130 | else if (!($is_all_uppercase || $is_all_lowercase) && (strpos($vendor,'Apple') !== false)) $illegal = true; |
131 | else if ($starts_with_uppercase && !$is_all_uppercase && (strpos($vendor,'Adobe') === false)) $illegal = true; |
131 | else if ($starts_with_uppercase && !$is_all_uppercase && (strpos($vendor,'Adobe') === false)) $illegal = true; |
132 | else if (!$starts_with_uppercase && !$is_all_uppercase && (strpos($vendor,'Adobe') !== false)) $illegal = true; |
132 | else if (!$starts_with_uppercase && !$is_all_uppercase && (strpos($vendor,'Adobe') !== false)) $illegal = true; |
133 | } |
133 | } |
134 | // In re 8B##, we just assume that 8B## was legally assigned to Adobe by Apple |
134 | // In re 8B##, we just assume that 8B## was legally assigned to Adobe by Apple |
135 | // Note: "8B" sounds like "Adobe" |
135 | // Note: "8B" sounds like "Adobe" |
136 | if ((substr($type,0,2) === '8B') && (strpos($vendor,'Adobe') !== false)) $illegal = false; |
136 | if ((substr($type,0,2) === '8B') && (strpos($vendor,'Adobe') !== false)) $illegal = false; |
137 | 137 | ||
138 | if ($illegal) $vendor .= ' (illegal)'; |
138 | if ($illegal) $vendor .= ' (illegal)'; |
139 | $vendor = str_pad($vendor, VENDOR_WIDTH, " ", STR_PAD_RIGHT); |
139 | $vendor = str_pad($vendor, VENDOR_WIDTH, " ", STR_PAD_RIGHT); |
140 | 140 | ||
141 | echo "| `$type` | $dec | $hex | $desc | $vendor |\n"; |
141 | echo "| `$type` | $dec | $hex | $desc | $vendor |\n"; |
142 | } |
142 | } |
143 | 143 | ||
144 | function ostype_footer() { |
144 | function ostype_footer() { |
145 | echo "\n"; |
145 | echo "\n"; |
146 | } |
146 | } |
147 | 147 | ||
148 | function ostype_header($title) { |
148 | function ostype_header($title) { |
149 | echo "$title\n"; |
149 | echo "$title\n"; |
150 | echo str_repeat('-',strlen($title))."\n"; |
150 | echo str_repeat('-',strlen($title))."\n"; |
151 | echo "\n"; |
151 | echo "\n"; |
152 | echo "| Type | Dec | Hex | ".str_pad('Description', DESC_WIDTH, " ", STR_PAD_RIGHT)." | ".str_pad('Vendor', VENDOR_WIDTH, " ", STR_PAD_RIGHT)." |\n"; |
152 | echo "| Type | Dec | Hex | ".str_pad('Description', DESC_WIDTH, " ", STR_PAD_RIGHT)." | ".str_pad('Vendor', VENDOR_WIDTH, " ", STR_PAD_RIGHT)." |\n"; |
153 | echo "|--------|------------|------------|".str_repeat('-', DESC_WIDTH+2)."|".str_repeat('-', VENDOR_WIDTH+2)."|\n"; |
153 | echo "|--------|------------|------------|".str_repeat('-', DESC_WIDTH+2)."|".str_repeat('-', VENDOR_WIDTH+2)."|\n"; |
154 | } |
154 | } |
155 | 155 | ||
156 | # ------------------------------------------------------------------------------ |
156 | # ------------------------------------------------------------------------------ |
157 | 157 | ||
158 | function pipl_property_info($ven, $type, $desc, $vendor) { |
158 | function pipl_property_info($ven, $type, $desc, $vendor) { |
159 | $vdec = 0; |
159 | $vdec = 0; |
160 | for ($i=0;$i<4;$i++) $vdec = ($vdec<<8) + ord($ven[$i]); |
160 | for ($i=0;$i<4;$i++) $vdec = ($vdec<<8) + ord($ven[$i]); |
161 | $vhex = "0x".str_pad(dechex($vdec), 8, "0", STR_PAD_LEFT); |
161 | $vhex = "0x".str_pad(dechex($vdec), 8, "0", STR_PAD_LEFT); |
162 | $vdec = str_pad($vdec, strlen(hexdec('ffffffff')), " ", STR_PAD_LEFT); |
162 | $vdec = str_pad((string)$vdec, strlen((string)hexdec('ffffffff')), " ", STR_PAD_LEFT); |
163 | 163 | ||
164 | $dec = 0; |
164 | $dec = 0; |
165 | for ($i=0;$i<4;$i++) $dec = ($dec<<8) + ord($type[$i]); |
165 | for ($i=0;$i<4;$i++) $dec = ($dec<<8) + ord($type[$i]); |
166 | $hex = "0x".str_pad(dechex($dec), 8, "0", STR_PAD_LEFT); |
166 | $hex = "0x".str_pad(dechex($dec), 8, "0", STR_PAD_LEFT); |
167 | $dec = str_pad($dec, strlen(hexdec('ffffffff')), " ", STR_PAD_LEFT); |
167 | $dec = str_pad((string)$dec, strlen((string)hexdec('ffffffff')), " ", STR_PAD_LEFT); |
168 | 168 | ||
169 | $desc = str_pad($desc, DESC_WIDTH, " ", STR_PAD_RIGHT); |
169 | $desc = str_pad($desc, DESC_WIDTH, " ", STR_PAD_RIGHT); |
170 | 170 | ||
171 | // In re 8B##, we just assume that 8B## was legally assigned to Adobe by Apple |
171 | // In re 8B##, we just assume that 8B## was legally assigned to Adobe by Apple |
172 | // Note: "8B" sounds like "Adobe" |
172 | // Note: "8B" sounds like "Adobe" |
173 | $illegal = (substr($ven,0,2) === '8B') != (strpos($vendor,'Adobe') !== false); |
173 | $illegal = (substr($ven,0,2) === '8B') != (strpos($vendor,'Adobe') !== false); |
174 | 174 | ||
175 | if ($illegal) $vendor .= ' (illegal)'; |
175 | if ($illegal) $vendor .= ' (illegal)'; |
176 | $vendor = str_pad($vendor, VENDOR_WIDTH, " ", STR_PAD_RIGHT); |
176 | $vendor = str_pad($vendor, VENDOR_WIDTH, " ", STR_PAD_RIGHT); |
177 | 177 | ||
178 | echo "| `$ven` | `$type` | $vdec $dec | $vhex $hex | $desc | $vendor |\n"; |
178 | echo "| `$ven` | `$type` | $vdec $dec | $vhex $hex | $desc | $vendor |\n"; |
179 | } |
179 | } |
180 | 180 | ||
181 | function pipl_property_footer() { |
181 | function pipl_property_footer() { |
182 | echo "\n"; |
182 | echo "\n"; |
183 | } |
183 | } |
184 | 184 | ||
185 | function pipl_property_header($title) { |
185 | function pipl_property_header($title) { |
186 | echo "$title\n"; |
186 | echo "$title\n"; |
187 | echo str_repeat('-',strlen($title))."\n"; |
187 | echo str_repeat('-',strlen($title))."\n"; |
188 | echo "\n"; |
188 | echo "\n"; |
189 | echo "| C.code | Prpty. | Dec | Hex | ".str_pad('Description', DESC_WIDTH, " ", STR_PAD_RIGHT)." | ".str_pad('Vendor', VENDOR_WIDTH, " ", STR_PAD_RIGHT)." |\n"; |
189 | echo "| C.code | Prpty. | Dec | Hex | ".str_pad('Description', DESC_WIDTH, " ", STR_PAD_RIGHT)." | ".str_pad('Vendor', VENDOR_WIDTH, " ", STR_PAD_RIGHT)." |\n"; |
190 | echo "|--------|--------|-----------------------|-----------------------|".str_repeat('-', DESC_WIDTH+2)."|".str_repeat('-', VENDOR_WIDTH+2)."|\n"; |
190 | echo "|--------|--------|-----------------------|-----------------------|".str_repeat('-', DESC_WIDTH+2)."|".str_repeat('-', VENDOR_WIDTH+2)."|\n"; |
191 | } |
191 | } |
192 | 192 |