Subversion Repositories HelenOS

Rev

Rev 1972 | Rev 2071 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1972 Rev 1974
Line 148... Line 148...
148
    return NULL;
148
    return NULL;
149
}
149
}
150
 
150
 
151
/** Lookup node with matching node_handle.
151
/** Lookup node with matching node_handle.
152
 *
152
 *
-
 
153
 * Child nodes are looked up recursively contrary to peer nodes that
-
 
154
 * are looked up iteratively to avoid stack overflow.
-
 
155
 *
153
 * @param root Root of the searched subtree.
156
 * @param root Root of the searched subtree.
154
 * @param handle OpenFirmware handle.
157
 * @param handle OpenFirmware handle.
155
 *
158
 *
156
 * @return NULL if there is no such node or pointer to the matching node.
159
 * @return NULL if there is no such node or pointer to the matching node.
157
 */
160
 */
158
ofw_tree_node_t *ofw_tree_find_node_by_handle(ofw_tree_node_t *root, uint32_t handle)
161
ofw_tree_node_t *ofw_tree_find_node_by_handle(ofw_tree_node_t *root, uint32_t handle)
159
{
162
{
160
    ofw_tree_node_t *node;
163
    ofw_tree_node_t *cur;
161
 
164
 
-
 
165
    for (cur = root; cur; cur = cur->peer) {       
162
    if (root->node_handle == handle)
166
        if (cur->node_handle == handle)
163
        return root;
167
            return cur;
164
 
168
 
165
    if (root->peer) {
169
        if (cur->child) {
166
        node = ofw_tree_find_node_by_handle(root->peer, handle);
-
 
167
        if (node)
-
 
168
            return node;
170
            ofw_tree_node_t *node;
169
    }
-
 
170
       
171
           
171
    if (root->child) {
-
 
172
        node = ofw_tree_find_node_by_handle(root->child, handle);
172
            node = ofw_tree_find_node_by_handle(cur->child, handle);
173
        if (node)
173
            if (node)
174
            return node;
174
                return node;
-
 
175
        }
175
    }
176
    }
176
   
177
   
177
    return NULL;   
178
    return NULL;   
178
}
179
}
179
 
180
 
Line 228... Line 229...
228
    }
229
    }
229
   
230
   
230
    return node;
231
    return node;
231
}
232
}
232
 
233
 
233
/** Recursively print subtree rooted in a node.
234
/** Print OpenFirmware device subtree rooted in a node.
-
 
235
 *
-
 
236
 * Child nodes are processed recursively and peer nodes are processed
-
 
237
 * iteratively in order to avoid stack overflow.
234
 *
238
 *
235
 * @param node Root of the subtree.
239
 * @param node Root of the subtree.
236
 * @param path Current path, NULL for the very root of the entire tree.
240
 * @param path Current path, NULL for the very root of the entire tree.
237
 */
241
 */
238
static void ofw_tree_node_print(const ofw_tree_node_t *node, const char *path)
242
static void ofw_tree_node_print(const ofw_tree_node_t *node, const char *path)
239
{
243
{
240
    char *p;
244
    char *p;
-
 
245
    const ofw_tree_node_t *cur;
241
 
246
 
242
    p = (char *) malloc(PATH_MAX_LEN, 0);
247
    p = (char *) malloc(PATH_MAX_LEN, 0);
243
 
248
 
-
 
249
    for (cur = node; cur; cur = cur->peer) {
244
    if (node->parent) {
250
        if (cur->parent) {
245
        snprintf(p, PATH_MAX_LEN, "%s/%s", path, node->da_name);
251
            snprintf(p, PATH_MAX_LEN, "%s/%s", path, cur->da_name);
246
        printf("%s\n", p);
252
            printf("%s\n", p);
247
    } else {
253
        } else {
248
        snprintf(p, PATH_MAX_LEN, "%s", node->da_name);
254
            snprintf(p, PATH_MAX_LEN, "%s", cur->da_name);
249
        printf("/\n");
255
            printf("/\n");
250
    }
256
        }
251
 
-
 
252
    if (node->child)
-
 
253
        ofw_tree_node_print(node->child, p);
-
 
254
 
257
 
255
    if (node->peer)
258
        if (cur->child)
256
        ofw_tree_node_print(node->peer, path);
259
            ofw_tree_node_print(cur->child, p);
-
 
260
    }
257
 
261
 
258
    free(p);
262
    free(p);
259
}
263
}
260
 
264
 
261
/** Print the structure of the OpenFirmware device tree. */
265
/** Print the structure of the OpenFirmware device tree. */