www.sas.com > Service and Support > Technical Support
 
Technical Support SAS - The power to know(tm)
  TS Home | Intro to Services | News and Info | Contact TS | Site Map | FAQ | Feedback


/*---------------------------------------------------------------------+
|                Copyright (c) 1996, SAS Institute Inc.                |
|                  Unpublished - All Rights Reserved                   |
|                      S A S / C   S A M P L E                         |
|                                                                      |
|         NAME: BTREE                                                  |
|     LANGUAGE: C                                                      |
|      PURPOSE: SAS/C DEBUGGER example program                         |
|               This program generates a binary tree. When run under   |
|               the control of the debugger, it opens up a Termin      |
|               window that you can use to enter several data lines.   |
|               The program inserts the lines in a binary tree, then   |
|               performs an in-order traversal, printing the data lines|
|               in sorted order.                                       |
|               See SAS/C Debugger User's Guide and Reference Third    |
|               Edition, Chapter 10, pgs. 209-212 .                    |
|   MISC NOTES: This program is used in conjunction with the DUMPTREE  |
|               program to demonstrate how to use a REXX EXEC with a   |
|               C program running under control of the SAS/C Debugger. |
| INPUT/OUTPUT: stdin/stdout                                           |
|               Since the input is stdin, you could type some lines in |
|               a file and redirect stdin to the file. However, the    |
|               simplest way to enter the lines is from the Termin     |
|               window.                                                |
|                                                                      |
| MVS -                                                                |
|    COMPILE, LINK: SUBMIT prefix.SAMPLE.AUX(BTREE)                    |
|               make sure to use the =DEBUG compile option             |
|               where "prefix" is the installation defined high-level  |
|               qualifier for the SAS/C product.                       |
|      EXECUTE: execute under TSO, see below                           |
| TSO -                                                                |
|    COMPILE: LC370 CLIST                                              |
|       LINK: CLK370 CLIST                                             |
|    EXECUTE: CALL your.load.lib(BTREE) '=DEBUG'                       |
| CMS -                                                                |
|    COMPILE: LC370 BTREE (DEBUG                                       |
|       LINK: CLINK BTREE (GENMOD                                      |
|    EXECUTE: BTREE =DEBUG                                             |
+---------------------------------------------------------------------*/
#eject
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

typedef struct TREENODE {
   size_t length;
   char *value;
   struct TREENODE *left, *right;
   } TreeNode;

static TreeNode *alloc_TreeNode(size_t, const char *);
static void insert_TreeNode(TreeNode *, size_t, const char *);
static void print_Tree(TreeNode *);

void main(void)
   {
   TreeNode *tree = NULL;
   char io_buffer[258];

   fgets(io_buffer, 256, stdin);
   while (!feof(stdin) && !ferror(stdin)) {
      size_t length = strlen(io_buffer) - 1;
      if (io_buffer[length] != '\n') {
         printf("String \"%.40s\" is too long.\n", io_buffer);
         exit(8);
         }
      if (tree == NULL)
         tree = alloc_TreeNode(length, io_buffer);
      else
         insert_TreeNode(tree, length, io_buffer);
      fgets(io_buffer, 256, stdin);
      }

   if (ferror(stdin)) {
      puts("Error reading input file.");
      exit(8);
      }

   print_Tree(tree);
   exit(0);
   }

static void insert_TreeNode(TreeNode *root, size_t length,
                                                   const char *string)
   {
   int cmp;

   cmp = memcmp(string, root->value, min(length, root->length));
   if (cmp == 0)
      cmp = length - root->length;

   if (cmp > 0) {
      if (root->left != NULL)
         insert_TreeNode(root->left, length, string);
      else
         root->left = alloc_TreeNode(length, string);
      }
   else if (cmp < 0) {
      if (root->right != NULL)
         insert_TreeNode(root->right, length, string);
      else
         root->right = alloc_TreeNode(length, string);
      }
   else
      return;
   }

static void print_Tree(TreeNode *root)
   {
   if (root->right != NULL)
      print_Tree(root->right);

   printf("%.*s\n", root->length, root->value);

   if (root->left != NULL)
      print_Tree(root->left);

   }

static TreeNode *alloc_TreeNode(size_t length, const char *string)
   {
   TreeNode *new;
   char *val;

   new = malloc(sizeof(TreeNode));

   if (new == NULL || (val = malloc(length)) == NULL) {
      puts("Can't allocate a new node");
      exit(8);
      }

   memcpy(val, string, length);
   new->length = length;
   new->value = val;
   new->left = new->right = NULL;

   return new;
   }

Copyright (c) 2000 SAS Institute Inc. All Rights Reserved.
Terms of Use & Legal Information | Privacy Statement