home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / octave-1.1.1p1-src.tgz / tar.out / fsf / octave / dld / define.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  2KB  |  71 lines

  1. /* define.c -- explicitly define a named symbol. */
  2.  
  3. /* This file is part of DLD, a dynamic link/unlink editor for C.
  4.    
  5.    Copyright (C) 1990 by W. Wilson Ho.
  6.  
  7.    The author can be reached electronically by how@cs.ucdavis.edu or
  8.    through physical mail at:
  9.  
  10.    W. Wilson Ho
  11.    Division of Computer Science
  12.    University of California at Davis
  13.    Davis, CA 95616
  14.  */
  15.  
  16. /* This program is free software; you can redistribute it and/or modify it
  17.    under the terms of the GNU General Public License as published by the
  18.    Free Software Foundation; either version 1, or (at your option) any
  19.    later version. */
  20.  
  21. #include "defs.h"
  22.  
  23. /*
  24.  *  explicitly define the value for symbol NAME.
  25.  *
  26.  *  SIZE is the number of bytes required.
  27.  */
  28. int
  29. dld_define_sym (name, size)
  30. char *name;
  31. unsigned int size;
  32. {
  33.     register char *p = 0;
  34.     struct nlist dummy_nlist;        /* simulate a nlist entry so that
  35.                        _dld_entery_global_ref can be used. */
  36.     register int old_undefined_sym_count;
  37.     
  38.     if (name == 0 || size == 0)
  39.     return 0;
  40.  
  41.     if (setjmp (_dld_env)) {
  42.     if (p) free (p);
  43.     return dld_errno;
  44.     }
  45.     
  46.     if (_dld_dummy_entry == 0)
  47.     _dld_create_dummy_entry ();
  48.  
  49.     bzero (&dummy_nlist, sizeof (struct nlist));
  50.  
  51.     p = (char *) _dld_malloc (strlen(name) +2);
  52.     *p = '_';
  53.     strcpy (p+1, name);
  54.  
  55.     dummy_nlist.n_un.n_name = p;
  56.     dummy_nlist.n_type = N_UNDF | N_EXT;
  57.     dummy_nlist.n_value = size;
  58.  
  59.     old_undefined_sym_count = dld_undefined_sym_count;
  60.     _dld_enter_global_ref (_dld_dummy_entry, &dummy_nlist, p);
  61.  
  62.     free (p);
  63.  
  64.     if (old_undefined_sym_count != dld_undefined_sym_count) {
  65.     _dld_patch_all_files (_dld_latest_entry);
  66.     _dld_exec_flags_valid = 0;
  67.     }
  68.     
  69.     return 0;
  70. } /* dld_define_sym */
  71.