PageRenderTime 50ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/opensource.apple.com/source/cctools/cctools-466/libstuff/symbol_list.c

#
C | 177 lines | 154 code | 9 blank | 14 comment | 13 complexity | db9087123f4095c26c796067d91a316d MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, GPL-2.0, BSD-3-Clause, GPL-3.0, MPL-2.0, LGPL-2.0, LGPL-2.1, CC-BY-SA-3.0, IPL-1.0, ISC, AGPL-1.0, AGPL-3.0, JSON, Apache-2.0, 0BSD
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <head>
  5. <title>symbol_list.c</title>
  6. <style type="text/css">
  7. .enscript-comment { font-style: italic; color: rgb(178,34,34); }
  8. .enscript-function-name { font-weight: bold; color: rgb(0,0,255); }
  9. .enscript-variable-name { font-weight: bold; color: rgb(184,134,11); }
  10. .enscript-keyword { font-weight: bold; color: rgb(160,32,240); }
  11. .enscript-reference { font-weight: bold; color: rgb(95,158,160); }
  12. .enscript-string { font-weight: bold; color: rgb(188,143,143); }
  13. .enscript-builtin { font-weight: bold; color: rgb(218,112,214); }
  14. .enscript-type { font-weight: bold; color: rgb(34,139,34); }
  15. .enscript-highlight { text-decoration: underline; color: 0; }
  16. </style>
  17. </head>
  18. <body id="top">
  19. <h1 style="margin:8px;" id="f1">symbol_list.c&nbsp;&nbsp;&nbsp;<span style="font-weight: normal; font-size: 0.5em;">[<a href="?txt">plain text</a>]</span></h1>
  20. <hr/>
  21. <div></div>
  22. <pre>
  23. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;stdlib.h&gt;</span>
  24. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;unistd.h&gt;</span>
  25. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;fcntl.h&gt;</span>
  26. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;sys/types.h&gt;</span>
  27. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;sys/stat.h&gt;</span>
  28. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;ctype.h&gt;</span>
  29. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;stuff/symbol_list.h&gt;</span>
  30. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;stuff/allocate.h&gt;</span>
  31. #<span class="enscript-reference">include</span> <span class="enscript-string">&lt;stuff/errors.h&gt;</span>
  32. <span class="enscript-type">static</span> <span class="enscript-type">int</span> <span class="enscript-function-name">cmp_qsort_name</span>(
  33. <span class="enscript-type">const</span> <span class="enscript-type">struct</span> symbol_list *sym1,
  34. <span class="enscript-type">const</span> <span class="enscript-type">struct</span> symbol_list *sym2);
  35. <span class="enscript-comment">/*
  36. * This is called to setup a symbol list from a file. It reads the file with
  37. * the strings in it and places them in an array of symbol_list structures and
  38. * then sorts them by name.
  39. *
  40. * The file that contains the symbol names must have symbol names one per line,
  41. * leading and trailing white space is removed and lines starting with a '#'
  42. * and lines with only white space are ignored.
  43. */</span>
  44. __private_extern__
  45. <span class="enscript-type">void</span>
  46. <span class="enscript-function-name">setup_symbol_list</span>(
  47. <span class="enscript-type">char</span> *file,
  48. <span class="enscript-type">struct</span> symbol_list **list,
  49. <span class="enscript-type">unsigned</span> <span class="enscript-type">long</span> *size)
  50. {
  51. <span class="enscript-type">int</span> fd;
  52. <span class="enscript-type">unsigned</span> <span class="enscript-type">long</span> i, j, len, strings_size;
  53. <span class="enscript-type">struct</span> stat stat_buf;
  54. <span class="enscript-type">char</span> *strings, *p, *line;
  55. <span class="enscript-keyword">if</span>((fd = open(file, O_RDONLY)) &lt; 0){
  56. system_error(<span class="enscript-string">&quot;can't open: %s&quot;</span>, file);
  57. <span class="enscript-keyword">return</span>;
  58. }
  59. <span class="enscript-keyword">if</span>(fstat(fd, &amp;stat_buf) == -1){
  60. system_error(<span class="enscript-string">&quot;can't stat: %s&quot;</span>, file);
  61. close(fd);
  62. <span class="enscript-keyword">return</span>;
  63. }
  64. strings_size = stat_buf.st_size;
  65. strings = (<span class="enscript-type">char</span> *)allocate(strings_size + 2);
  66. strings[strings_size] = <span class="enscript-string">'\n'</span>;
  67. strings[strings_size + 1] = <span class="enscript-string">'\0'</span>;
  68. <span class="enscript-keyword">if</span>(read(fd, strings, strings_size) != (<span class="enscript-type">int</span>)strings_size){
  69. system_error(<span class="enscript-string">&quot;can't read: %s&quot;</span>, file);
  70. close(fd);
  71. <span class="enscript-keyword">return</span>;
  72. }
  73. <span class="enscript-comment">/*
  74. * Change the newlines to '\0' and count the number of lines with
  75. * symbol names. Lines starting with '#' are comments and lines
  76. * contain all space characters do not contain symbol names.
  77. */</span>
  78. p = strings;
  79. line = p;
  80. <span class="enscript-keyword">for</span>(i = 0; i &lt; strings_size + 1; i++){
  81. <span class="enscript-keyword">if</span>(*p == <span class="enscript-string">'\n'</span> || *p == <span class="enscript-string">'\r'</span>){
  82. *p = <span class="enscript-string">'\0'</span>;
  83. <span class="enscript-keyword">if</span>(*line != <span class="enscript-string">'#'</span>){
  84. <span class="enscript-keyword">while</span>(*line != <span class="enscript-string">'\0'</span> &amp;&amp; isspace(*line))
  85. line++;
  86. <span class="enscript-keyword">if</span>(*line != <span class="enscript-string">'\0'</span>)
  87. (*size)++;
  88. }
  89. p++;
  90. line = p;
  91. }
  92. <span class="enscript-keyword">else</span>{
  93. p++;
  94. }
  95. }
  96. *list = (<span class="enscript-type">struct</span> symbol_list *)
  97. allocate((*size) * <span class="enscript-keyword">sizeof</span>(<span class="enscript-type">struct</span> symbol_list));
  98. <span class="enscript-comment">/*
  99. * Place the strings in the list trimming leading and trailing spaces
  100. * from the lines with symbol names.
  101. */</span>
  102. p = strings;
  103. line = p;
  104. <span class="enscript-keyword">for</span>(i = 0; i &lt; (*size); ){
  105. p += strlen(p) + 1;
  106. <span class="enscript-keyword">if</span>(*line != <span class="enscript-string">'#'</span> &amp;&amp; *line != <span class="enscript-string">'\0'</span>){
  107. <span class="enscript-keyword">while</span>(*line != <span class="enscript-string">'\0'</span> &amp;&amp; isspace(*line))
  108. line++;
  109. <span class="enscript-keyword">if</span>(*line != <span class="enscript-string">'\0'</span>){
  110. (*list)[i].name = line;
  111. (*list)[i].seen = FALSE;
  112. i++;
  113. len = strlen(line);
  114. j = len - 1;
  115. <span class="enscript-keyword">while</span>(j &gt; 0 &amp;&amp; isspace(line[j])){
  116. j--;
  117. }
  118. <span class="enscript-keyword">if</span>(j &gt; 0 &amp;&amp; j + 1 &lt; len &amp;&amp; isspace(line[j+1]))
  119. line[j+1] = <span class="enscript-string">'\0'</span>;
  120. }
  121. }
  122. line = p;
  123. }
  124. qsort(*list, *size, <span class="enscript-keyword">sizeof</span>(<span class="enscript-type">struct</span> symbol_list),
  125. (<span class="enscript-type">int</span> (*)(<span class="enscript-type">const</span> <span class="enscript-type">void</span> *, <span class="enscript-type">const</span> <span class="enscript-type">void</span> *))cmp_qsort_name);
  126. <span class="enscript-comment">/* remove duplicates on the list */</span>
  127. <span class="enscript-keyword">for</span>(i = 0; i &lt; (*size); i++){
  128. <span class="enscript-keyword">if</span>(i + 1 &lt; (*size)){
  129. <span class="enscript-keyword">if</span>(strcmp((*list)[i].name, (*list)[i+1].name) == 0){
  130. <span class="enscript-keyword">for</span>(j = 1; j &lt; ((*size) - i - 1); j++){
  131. (*list)[i + j].name = (*list)[i + j + 1].name;
  132. }
  133. *size = *size - 1;
  134. }
  135. }
  136. }
  137. #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">DEBUG</span>
  138. printf(<span class="enscript-string">&quot;symbol list:\n&quot;</span>);
  139. <span class="enscript-keyword">for</span>(i = 0; i &lt; (*size); i++){
  140. printf(<span class="enscript-string">&quot;0x%x name = %s\n&quot;</span>, &amp;((*list)[i]),(*list)[i].name);
  141. }
  142. #<span class="enscript-reference">endif</span> <span class="enscript-comment">/* DEBUG */</span>
  143. }
  144. <span class="enscript-comment">/*
  145. * Function for qsort for comparing symbol list names.
  146. */</span>
  147. <span class="enscript-type">static</span>
  148. <span class="enscript-type">int</span>
  149. <span class="enscript-function-name">cmp_qsort_name</span>(
  150. <span class="enscript-type">const</span> <span class="enscript-type">struct</span> symbol_list *sym1,
  151. <span class="enscript-type">const</span> <span class="enscript-type">struct</span> symbol_list *sym2)
  152. {
  153. <span class="enscript-keyword">return</span>(strcmp(sym1-&gt;name, sym2-&gt;name));
  154. }
  155. <span class="enscript-comment">/*
  156. * Function for bsearch for finding a symbol name.
  157. */</span>
  158. __private_extern__
  159. <span class="enscript-type">int</span>
  160. <span class="enscript-function-name">symbol_list_bsearch</span>(
  161. <span class="enscript-type">const</span> <span class="enscript-type">char</span> *name,
  162. <span class="enscript-type">const</span> <span class="enscript-type">struct</span> symbol_list *sym)
  163. {
  164. <span class="enscript-keyword">return</span>(strcmp(name, sym-&gt;name));
  165. }
  166. </pre>
  167. <hr />
  168. </body></html>