/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
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
- <head>
- <title>symbol_list.c</title>
- <style type="text/css">
- .enscript-comment { font-style: italic; color: rgb(178,34,34); }
- .enscript-function-name { font-weight: bold; color: rgb(0,0,255); }
- .enscript-variable-name { font-weight: bold; color: rgb(184,134,11); }
- .enscript-keyword { font-weight: bold; color: rgb(160,32,240); }
- .enscript-reference { font-weight: bold; color: rgb(95,158,160); }
- .enscript-string { font-weight: bold; color: rgb(188,143,143); }
- .enscript-builtin { font-weight: bold; color: rgb(218,112,214); }
- .enscript-type { font-weight: bold; color: rgb(34,139,34); }
- .enscript-highlight { text-decoration: underline; color: 0; }
- </style>
- </head>
- <body id="top">
- <h1 style="margin:8px;" id="f1">symbol_list.c <span style="font-weight: normal; font-size: 0.5em;">[<a href="?txt">plain text</a>]</span></h1>
- <hr/>
- <div></div>
- <pre>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><stdlib.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><unistd.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><fcntl.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><sys/types.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><sys/stat.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><ctype.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><stuff/symbol_list.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><stuff/allocate.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><stuff/errors.h></span>
- <span class="enscript-type">static</span> <span class="enscript-type">int</span> <span class="enscript-function-name">cmp_qsort_name</span>(
- <span class="enscript-type">const</span> <span class="enscript-type">struct</span> symbol_list *sym1,
- <span class="enscript-type">const</span> <span class="enscript-type">struct</span> symbol_list *sym2);
- <span class="enscript-comment">/*
- * This is called to setup a symbol list from a file. It reads the file with
- * the strings in it and places them in an array of symbol_list structures and
- * then sorts them by name.
- *
- * The file that contains the symbol names must have symbol names one per line,
- * leading and trailing white space is removed and lines starting with a '#'
- * and lines with only white space are ignored.
- */</span>
- __private_extern__
- <span class="enscript-type">void</span>
- <span class="enscript-function-name">setup_symbol_list</span>(
- <span class="enscript-type">char</span> *file,
- <span class="enscript-type">struct</span> symbol_list **list,
- <span class="enscript-type">unsigned</span> <span class="enscript-type">long</span> *size)
- {
- <span class="enscript-type">int</span> fd;
- <span class="enscript-type">unsigned</span> <span class="enscript-type">long</span> i, j, len, strings_size;
- <span class="enscript-type">struct</span> stat stat_buf;
- <span class="enscript-type">char</span> *strings, *p, *line;
- <span class="enscript-keyword">if</span>((fd = open(file, O_RDONLY)) < 0){
- system_error(<span class="enscript-string">"can't open: %s"</span>, file);
- <span class="enscript-keyword">return</span>;
- }
- <span class="enscript-keyword">if</span>(fstat(fd, &stat_buf) == -1){
- system_error(<span class="enscript-string">"can't stat: %s"</span>, file);
- close(fd);
- <span class="enscript-keyword">return</span>;
- }
- strings_size = stat_buf.st_size;
- strings = (<span class="enscript-type">char</span> *)allocate(strings_size + 2);
- strings[strings_size] = <span class="enscript-string">'\n'</span>;
- strings[strings_size + 1] = <span class="enscript-string">'\0'</span>;
- <span class="enscript-keyword">if</span>(read(fd, strings, strings_size) != (<span class="enscript-type">int</span>)strings_size){
- system_error(<span class="enscript-string">"can't read: %s"</span>, file);
- close(fd);
- <span class="enscript-keyword">return</span>;
- }
- <span class="enscript-comment">/*
- * Change the newlines to '\0' and count the number of lines with
- * symbol names. Lines starting with '#' are comments and lines
- * contain all space characters do not contain symbol names.
- */</span>
- p = strings;
- line = p;
- <span class="enscript-keyword">for</span>(i = 0; i < strings_size + 1; i++){
- <span class="enscript-keyword">if</span>(*p == <span class="enscript-string">'\n'</span> || *p == <span class="enscript-string">'\r'</span>){
- *p = <span class="enscript-string">'\0'</span>;
- <span class="enscript-keyword">if</span>(*line != <span class="enscript-string">'#'</span>){
- <span class="enscript-keyword">while</span>(*line != <span class="enscript-string">'\0'</span> && isspace(*line))
- line++;
- <span class="enscript-keyword">if</span>(*line != <span class="enscript-string">'\0'</span>)
- (*size)++;
- }
- p++;
- line = p;
- }
- <span class="enscript-keyword">else</span>{
- p++;
- }
- }
- *list = (<span class="enscript-type">struct</span> symbol_list *)
- allocate((*size) * <span class="enscript-keyword">sizeof</span>(<span class="enscript-type">struct</span> symbol_list));
- <span class="enscript-comment">/*
- * Place the strings in the list trimming leading and trailing spaces
- * from the lines with symbol names.
- */</span>
- p = strings;
- line = p;
- <span class="enscript-keyword">for</span>(i = 0; i < (*size); ){
- p += strlen(p) + 1;
- <span class="enscript-keyword">if</span>(*line != <span class="enscript-string">'#'</span> && *line != <span class="enscript-string">'\0'</span>){
- <span class="enscript-keyword">while</span>(*line != <span class="enscript-string">'\0'</span> && isspace(*line))
- line++;
- <span class="enscript-keyword">if</span>(*line != <span class="enscript-string">'\0'</span>){
- (*list)[i].name = line;
- (*list)[i].seen = FALSE;
- i++;
- len = strlen(line);
- j = len - 1;
- <span class="enscript-keyword">while</span>(j > 0 && isspace(line[j])){
- j--;
- }
- <span class="enscript-keyword">if</span>(j > 0 && j + 1 < len && isspace(line[j+1]))
- line[j+1] = <span class="enscript-string">'\0'</span>;
- }
- }
- line = p;
- }
- qsort(*list, *size, <span class="enscript-keyword">sizeof</span>(<span class="enscript-type">struct</span> symbol_list),
- (<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);
- <span class="enscript-comment">/* remove duplicates on the list */</span>
- <span class="enscript-keyword">for</span>(i = 0; i < (*size); i++){
- <span class="enscript-keyword">if</span>(i + 1 < (*size)){
- <span class="enscript-keyword">if</span>(strcmp((*list)[i].name, (*list)[i+1].name) == 0){
- <span class="enscript-keyword">for</span>(j = 1; j < ((*size) - i - 1); j++){
- (*list)[i + j].name = (*list)[i + j + 1].name;
- }
- *size = *size - 1;
- }
- }
- }
- #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">DEBUG</span>
- printf(<span class="enscript-string">"symbol list:\n"</span>);
- <span class="enscript-keyword">for</span>(i = 0; i < (*size); i++){
- printf(<span class="enscript-string">"0x%x name = %s\n"</span>, &((*list)[i]),(*list)[i].name);
- }
- #<span class="enscript-reference">endif</span> <span class="enscript-comment">/* DEBUG */</span>
- }
- <span class="enscript-comment">/*
- * Function for qsort for comparing symbol list names.
- */</span>
- <span class="enscript-type">static</span>
- <span class="enscript-type">int</span>
- <span class="enscript-function-name">cmp_qsort_name</span>(
- <span class="enscript-type">const</span> <span class="enscript-type">struct</span> symbol_list *sym1,
- <span class="enscript-type">const</span> <span class="enscript-type">struct</span> symbol_list *sym2)
- {
- <span class="enscript-keyword">return</span>(strcmp(sym1->name, sym2->name));
- }
- <span class="enscript-comment">/*
- * Function for bsearch for finding a symbol name.
- */</span>
- __private_extern__
- <span class="enscript-type">int</span>
- <span class="enscript-function-name">symbol_list_bsearch</span>(
- <span class="enscript-type">const</span> <span class="enscript-type">char</span> *name,
- <span class="enscript-type">const</span> <span class="enscript-type">struct</span> symbol_list *sym)
- {
- <span class="enscript-keyword">return</span>(strcmp(name, sym->name));
- }
- </pre>
- <hr />
- </body></html>