builtin.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /* $Id$ */
  2. /*
  3. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  4. * See the copyright notice in the ACK home directory, in the file "Copyright".
  5. */
  6. /* builtin.c - built in named processes */
  7. #include "ocm_chan.h"
  8. #ifndef nil
  9. #define nil 0
  10. #endif
  11. extern int errno;
  12. static void nullterm(s) register char *s;
  13. /* Change Occam string to C string */
  14. {
  15. register len= (*s & 0377);
  16. register char *p;
  17. while (--len>=0) {
  18. p=s++;
  19. *p = *s;
  20. }
  21. *s=0;
  22. }
  23. static void lenterm(s) register char *s;
  24. /* Change C string to Occam string */
  25. {
  26. register i=0;
  27. register c0, c1;
  28. c0=0;
  29. do {
  30. c1=s[i];
  31. s[i++]=c0;
  32. c0=c1;
  33. } while (c0!=0);
  34. *s= i-1;
  35. }
  36. void b_open(mode, name, index) register char *mode, *name; long *index;
  37. /* PROC open(VAR index, VALUE name[], mode[])= */
  38. {
  39. register FILE *fp;
  40. register i;
  41. nullterm(name);
  42. nullterm(mode);
  43. fp=fopen(name, mode);
  44. lenterm(name);
  45. lenterm(mode);
  46. if (fp==nil)
  47. *index= -errno;
  48. else {
  49. /* Find free file channel, there must be one free! */
  50. for (i=0; (file[i].f.flgs&C_F_INUSE)!=0; i++) ;
  51. file[i].f.flgs|=C_F_INUSE;
  52. unix_file[i]=fp;
  53. *index=i;
  54. }
  55. }
  56. void b_close(index) long index;
  57. /* PROC close(VALUE index)= */
  58. {
  59. fclose(unix_file[index]);
  60. file[index].f.flgs&= ~C_F_INUSE;
  61. }
  62. void b_exit(code) long code;
  63. /* PROC exit(VALUE code)= */
  64. {
  65. exit((int) code);
  66. }