1 /* SC A Table Calculator 2 * Common definitions 3 * 4 * original by James Gosling, September 1982 5 * modified by Mark Weiser and Bruce Israel, 6 * University of Maryland 7 * R. Bond 12/86 8 * More mods by Alan Silverstein, 3-4/88, see list of changes. 9 * $Revision: 7.16 $ 10 * 11 */ 12 13 #ifdef MSDOS 14 #include <stdio.h> 15 #endif 16 17 #define ATBL(tbl, row, col) (*(tbl + row) + (col)) 18 19 #define MINROWS 100 /* minimum size at startup */ 20 #define MINCOLS 30 21 #define ABSMAXCOLS 702 /* absolute cols: ZZ (base 26) */ 22 23 #define CRROWS 1 24 #define CRCOLS 2 25 #define RESROW 3 /* rows reserved for prompt, error, and column numbers */ 26 27 /* formats for engformat() */ 28 #define REFMTFIX 0 29 #define REFMTFLT 1 30 #define REFMTENG 2 31 #define REFMTDATE 3 32 #define REFMTLDATE 4 33 34 #define DEFWIDTH 10 /* Default column width and precision */ 35 #define DEFPREC 2 36 #define DEFREFMT REFMTFIX /* Make default format fixed point THA 10/14/90 */ 37 38 #define FKEYS 24 /* Number of function keys available */ 39 #define HISTLEN 100 /* Number of history entries for vi emulation */ 40 #define CPAIRS 8 /* Number of color pairs available */ 41 #define COLFORMATS 10 /* Number of custom column formats */ 42 #define DELBUFSIZE 40 /* Number of named buffers + 4 */ 43 #ifdef PSC 44 # define error(msg) fprintf(stderr, msg); 45 #else 46 # define error isatty(fileno(stdout)) && !move(1,0) && !clrtoeol() && printw 47 #endif 48 #define FBUFLEN 1024 /* buffer size for a single field */ 49 #define PATHLEN 1024 /* maximum path length */ 50 51 #ifndef DFLT_PAGER 52 #define DFLT_PAGER "more" /* more is probably more widespread than less */ 53 #endif /* DFLT_PAGER */ 54 55 #define MAXCMD 160 /* for ! command and commands that use the pager */ 56 57 58 #ifndef A_CHARTEXT /* Should be defined in curses.h */ 59 #define A_CHARTEXT 0xff 60 #endif 61 62 #ifndef color_set 63 #define color_set(c, o) attron(COLOR_PAIR(c)) 64 #endif 65 66 #if !defined(attr_get) || defined(NCURSES_VERSION) && NCURSES_VERSION_MAJOR < 5 67 #undef attr_get 68 #define attr_get(a, p, o) ((void)((a) != 0 && (*(a) = stdscr->_attrs)), \ 69 (void)((p) != 0 && \ 70 (*(p) = PAIR_NUMBER(stdscr->_attrs))), OK) 71 #endif 72 73 #if (defined(BSD42) || defined(BSD43)) && !defined(strrchr) 74 #define strrchr rindex 75 #endif 76 77 #if (defined(BSD42) || defined(BSD43)) && !defined(strchr) 78 #define strchr index 79 #endif 80 81 #ifdef SYSV4 82 size_t strlen(); 83 #endif 84 85 #ifndef FALSE 86 # define FALSE 0 87 # define TRUE 1 88 #endif /* !FALSE */ 89 90 /* 91 * ent_ptr holds the row/col # and address type of a cell 92 * 93 * vf is the type of cell address, 0 non-fixed, or bitwise OR of FIX_ROW or 94 * FIX_COL 95 * vp : we just use vp->row or vp->col, vp may be a new cell just for holding 96 * row/col (say in gram.y) or a pointer to an existing cell 97 */ 98 struct ent_ptr { 99 int vf; 100 struct ent *vp; 101 }; 102 103 /* holds the beginning/ending cells of a range */ 104 struct range_s { 105 struct ent_ptr left, right; 106 }; 107 108 /* 109 * Some not too obvious things about the flags: 110 * is_valid means there is a valid number in v. 111 * is_locked means that the cell cannot be edited. 112 * is_label set means it points to a valid constant string. 113 * is_strexpr set means expr yields a string expression. 114 * If is_strexpr is not set, and expr points to an expression tree, the 115 * expression yields a numeric expression. 116 * So, either v or label can be set to a constant. 117 * Either (but not both at the same time) can be set from an expression. 118 */ 119 120 #define VALID_CELL(p, r, c) ((p = *ATBL(tbl, r, c)) && \ 121 ((p->flags & is_valid) || p->label)) 122 123 /* info for each cell, only alloc'd when something is stored in a cell */ 124 struct ent { 125 double v; /* v && label are set in EvalAll() */ 126 char *label; 127 struct enode *expr; /* cell's contents */ 128 short flags; 129 short row, col; 130 short nrow, ncol; /* link to note */ 131 short nlastrow, nlastcol; 132 struct ent *next; /* next deleted ent (pulled, deleted cells) */ 133 char *format; /* printf format for this cell */ 134 char cellerror; /* error in a cell? */ 135 }; 136 137 #define FIX_ROW 1 138 #define FIX_COL 2 139 140 /* stores type of operation this cell will perform */ 141 struct enode { 142 int op; 143 union { 144 int gram_match; /* some compilers (hp9000ipc) need this */ 145 double k; /* constant # */ 146 struct ent_ptr v; /* ref. another cell */ 147 struct range_s r; /* op is on a range */ 148 char *s; /* string part of a cell */ 149 struct { /* other cells use to eval()/seval() */ 150 struct enode *left, *right; 151 char *s; /* previous value of @ext function in case */ 152 } o; /* external functions are turned off */ 153 } e; 154 }; 155 156 /* stores a range (left, right) */ 157 struct range { 158 struct ent_ptr r_left, r_right; 159 char *r_name; /* possible name for this range */ 160 struct range *r_next, *r_prev; /* chained ranges */ 161 int r_is_range; 162 }; 163 164 /* stores a framed range (left, right) */ 165 struct frange { 166 struct ent *or_left, *or_right; /* outer range */ 167 struct ent *ir_left, *ir_right; /* inner range */ 168 struct frange *r_next, *r_prev; /* chained ranges */ 169 }; 170 171 /* stores a color range (left, right) */ 172 struct crange { 173 struct ent *r_left, *r_right; 174 int r_color; 175 struct crange *r_next, *r_prev; /* chained ranges */ 176 }; 177 178 struct colorpair { 179 int fg; 180 int bg; 181 struct enode *expr; 182 }; 183 184 /* stores an abbreviation and its expansion */ 185 struct abbrev { 186 char *abbr; 187 char *exp; 188 struct abbrev *a_next, *a_prev; 189 }; 190 191 struct impexfilt { 192 char ext[PATHLEN]; 193 char plugin[PATHLEN]; 194 char type; 195 struct impexfilt *next; 196 }; 197 198 /* Use this structure to save the last 'g' command */ 199 struct go_save { 200 int g_type; 201 double g_n; 202 char *g_s; 203 int g_row; 204 int g_col; 205 int g_lastrow; 206 int g_lastcol; 207 int strow; 208 int stcol; 209 int stflag; 210 int errsearch; 211 }; 212 213 /* op values */ 214 #define O_VAR 'v' 215 #define O_CONST 'k' 216 #define O_ECONST 'E' /* constant cell w/ an error */ 217 #define O_SCONST '$' 218 #define REDUCE 0200 /* Or'ed into OP if operand is a range */ 219 220 #define OP_BASE 256 221 #define ACOS (OP_BASE + 0) 222 #define ASIN (OP_BASE + 1) 223 #define ATAN (OP_BASE + 2) 224 #define CEIL (OP_BASE + 3) 225 #define COS (OP_BASE + 4) 226 #define EXP (OP_BASE + 5) 227 #define FABS (OP_BASE + 6) 228 #define FLOOR (OP_BASE + 7) 229 #define HYPOT (OP_BASE + 8) 230 #define LOG (OP_BASE + 9) 231 #define LOG10 (OP_BASE + 10) 232 #define POW (OP_BASE + 11) 233 #define SIN (OP_BASE + 12) 234 #define SQRT (OP_BASE + 13) 235 #define TAN (OP_BASE + 14) 236 #define DTR (OP_BASE + 15) 237 #define RTD (OP_BASE + 16) 238 #define SUM (OP_BASE + 17) 239 #define PROD (OP_BASE + 18) 240 #define AVG (OP_BASE + 19) 241 #define COUNT (OP_BASE + 20) 242 #define STDDEV (OP_BASE + 21) 243 #define MAX (OP_BASE + 22) 244 #define MIN (OP_BASE + 23) 245 #define RND (OP_BASE + 24) 246 #define HOUR (OP_BASE + 25) 247 #define MINUTE (OP_BASE + 26) 248 #define SECOND (OP_BASE + 27) 249 #define MONTH (OP_BASE + 28) 250 #define DAY (OP_BASE + 29) 251 #define YEAR (OP_BASE + 30) 252 #define NOW (OP_BASE + 31) 253 #define DATE (OP_BASE + 32) 254 #define FMT (OP_BASE + 33) 255 #define SUBSTR (OP_BASE + 34) 256 #define STON (OP_BASE + 35) 257 #define EQS (OP_BASE + 36) 258 #define EXT (OP_BASE + 37) 259 #define ELIST (OP_BASE + 38) /* List of expressions */ 260 #define LMAX (OP_BASE + 39) 261 #define LMIN (OP_BASE + 40) 262 #define NVAL (OP_BASE + 41) 263 #define SVAL (OP_BASE + 42) 264 #define PV (OP_BASE + 43) 265 #define FV (OP_BASE + 44) 266 #define PMT (OP_BASE + 45) 267 #define STINDEX (OP_BASE + 46) 268 #define LOOKUP (OP_BASE + 47) 269 #define ATAN2 (OP_BASE + 48) 270 #define INDEX (OP_BASE + 49) 271 #define DTS (OP_BASE + 50) 272 #define TTS (OP_BASE + 51) 273 #define ABS (OP_BASE + 52) 274 #define HLOOKUP (OP_BASE + 53) 275 #define VLOOKUP (OP_BASE + 54) 276 #define ROUND (OP_BASE + 55) 277 #define IF (OP_BASE + 56) 278 #define FILENAME (OP_BASE + 57) 279 #define MYROW (OP_BASE + 58) 280 #define MYCOL (OP_BASE + 59) 281 #define LASTROW (OP_BASE + 60) 282 #define LASTCOL (OP_BASE + 61) 283 #define COLTOA (OP_BASE + 62) 284 #define UPPER (OP_BASE + 63) 285 #define LOWER (OP_BASE + 64) 286 #define CAPITAL (OP_BASE + 65) 287 #define NUMITER (OP_BASE + 66) 288 #define ERR_ (OP_BASE + 67) 289 #define PI_ (OP_BASE + 68) 290 #define BLACK (OP_BASE + 69) 291 #define RED (OP_BASE + 70) 292 #define GREEN (OP_BASE + 71) 293 #define YELLOW (OP_BASE + 72) 294 #define BLUE (OP_BASE + 73) 295 #define MAGENTA (OP_BASE + 74) 296 #define CYAN (OP_BASE + 75) 297 #define WHITE (OP_BASE + 76) 298 299 #undef is_cleared 300 #define is_valid 0001 301 #define is_changed 0002 302 #define is_strexpr 0004 303 #define is_leftflush 0010 304 #define is_deleted 0020 305 #define is_locked 0040 306 #define is_label 0100 307 #define is_cleared 0200 308 #define may_sync 0400 309 310 /* cell error (1st generation (ERROR) or 2nd+ (INVALID)) */ 311 #define CELLOK 0 312 #define CELLERROR 1 313 #define CELLINVALID 2 314 315 #define ctl(c) ((c)&037) 316 #define ESC 033 317 #define DEL 0177 318 319 /* calculation order */ 320 #define BYCOLS 1 321 #define BYROWS 2 322 323 /* values for showrange for ranges of rows or columns */ 324 #define SHOWROWS 2 325 #define SHOWCOLS 3 326 327 /* tblprint style output for: */ 328 #define TBL 1 /* 'tbl' */ 329 #define LATEX 2 /* 'LaTeX' */ 330 #define TEX 3 /* 'TeX' */ 331 #define SLATEX 4 /* 'SLaTeX' (Scandinavian LaTeX) */ 332 #define FRAME 5 /* tblprint style output for FrameMaker */ 333 334 /* Types for etype() */ 335 #define NUM 1 336 #define STR 2 337 338 #define GROWAMT 30 /* default minimum amount to grow */ 339 340 #define GROWNEW 1 /* first time table */ 341 #define GROWROW 2 /* add rows */ 342 #define GROWCOL 3 /* add columns */ 343 #define GROWBOTH 4 /* grow both */ 344 extern struct ent ***tbl; /* data table ref. in vmtbl.c and ATBL() */ 345 346 extern char curfile[]; 347 extern int arg; 348 extern int strow, stcol; 349 extern int currow, curcol; 350 extern int gmyrow, gmycol; /* globals used for @myrow, @mycol cmds */ 351 extern int rescol; /* columns reserved for row numbers */ 352 extern int savedrow[37], savedcol[37]; 353 extern int savedstrow[37], savedstcol[37]; 354 extern int FullUpdate; 355 extern int maxrow, maxcol; 356 extern int maxrows, maxcols; /* # cells currently allocated */ 357 extern int rowsinrange; /* Number of rows in target range of a goto */ 358 extern int colsinrange; /* Number of cols in target range of a goto */ 359 extern int *fwidth; 360 extern int *precision; 361 extern int *realfmt; 362 extern char *colformat[10]; 363 extern char *col_hidden; 364 extern char *row_hidden; 365 extern char line[FBUFLEN]; 366 extern int linelim; 367 extern int changed; 368 extern struct ent *delbuf[DELBUFSIZE]; 369 extern char *delbuffmt[DELBUFSIZE]; 370 extern int dbidx; 371 extern int qbuf; /* buffer no. specified by `"' command */ 372 extern int showsc, showsr; 373 extern int showrange; /* Causes ranges to be highlighted */ 374 extern int cellassign; 375 extern int macrofd; 376 extern int cslop; 377 extern int usecurses; 378 extern int brokenpipe; /* Set to true if SIGPIPE is received */ 379 extern char dpoint; /* country-dependent decimal point from locale */ 380 extern char thsep; /* country-dependent thousands separator from locale */ 381 382 extern FILE *openfile(char *fname, int *rpid, int *rfd); 383 extern char *coltoa(int col); 384 extern char *findplugin(char *ext, char type); 385 extern char *findhome(char *path); 386 extern char *r_name(int r1, int c1, int r2, int c2); 387 extern char *scxmalloc(unsigned n); 388 extern char *scxrealloc(char *ptr, unsigned n); 389 extern char *seval(register struct enode *se); 390 extern char *v_name(int row, int col); 391 extern double eval(register struct enode *e); 392 extern int any_locked_cells(int r1, int c1, int r2, int c2); 393 extern int are_colors(); 394 extern int are_frames(); 395 extern int are_ranges(); 396 extern int atocol(char *string, int len); 397 extern int creadfile(char *save, int eraseflg); 398 extern int cwritefile(char *fname, int r0, int c0, int rn, int cn); 399 extern int engformat(int fmt, int width, int lprecision, double val, 400 char *buf, int buflen); 401 extern int etype(register struct enode *e); 402 extern int find_range(char *name, int len, struct ent *lmatch, 403 struct ent *rmatch, struct range **rng); 404 extern int format(char *fmt, int lprecision, double val, char *buf, 405 int buflen); 406 extern int get_rcqual(int ch); 407 extern int growtbl(int rowcol, int toprow, int topcol); 408 extern int locked_cell(int r, int c); 409 extern int modcheck(char *endstr); 410 extern int nmgetch(); 411 extern int plugin_exists(char *name, int len, char *path); 412 extern int readfile(char *fname, int eraseflg); 413 extern int writefile(char *fname, int r0, int c0, int rn, int cn); 414 extern int yn_ask(char *msg); 415 extern struct abbrev *find_abbr(char *abbrev, int len, struct abbrev **prev); 416 extern struct colorpair *cpairs[8]; 417 extern struct enode *copye(register struct enode *e, int Rdelta, int Cdelta, 418 int r1, int c1, int r2, int c2, int transpose); 419 extern struct enode *new(int op, struct enode *a1, struct enode *a2); 420 extern struct enode *new_const(int op, double a1); 421 extern struct enode *new_range(int op, struct range_s a1); 422 extern struct enode *new_str(char *s); 423 extern struct enode *new_var(int op, struct ent_ptr a1); 424 extern struct ent *lookat(int row, int col); 425 extern struct crange *find_crange(int row, int col); 426 extern struct frange *find_frange(int row, int col); 427 extern void EvalAll(); 428 extern void add_crange(struct ent *r_left, struct ent *r_right, int pair); 429 extern void add_frange(struct ent *or_left, struct ent *or_right, 430 struct ent *ir_left, struct ent *ir_right, int toprows, int bottomrows, 431 int leftcols, int rightcols); 432 extern void add_range(char *name, struct ent_ptr left, struct ent_ptr right, 433 int is_range); 434 extern void addplugin(char *ext, char *plugin, char type); 435 extern void backcol(int arg); 436 extern void backrow(int arg); 437 extern void change_color(int pair, struct enode *e); 438 extern void checkbounds(int *rowp, int *colp); 439 extern void clearent(struct ent *v); 440 extern void clean_crange(); 441 extern void clean_frange(); 442 extern void clean_range(); 443 extern void closecol(int arg); 444 extern void closefile(FILE *f, int pid, int rfd); 445 extern void closerow(int r, int numrow); 446 extern void colshow_op(); 447 extern void copy(struct ent *dv1, struct ent *dv2, struct ent *v1, 448 struct ent *v2); 449 extern void copyent(register struct ent *n, register struct ent *p, 450 int dr, int dc, int r1, int c1, int r2, int c2, int transpose); 451 extern void decompile(register struct enode *e, int priority); 452 extern void deleterow(register int arg); 453 extern void del_range(struct ent *left, struct ent *right); 454 extern void del_abbr(char *abbrev); 455 extern void deraw(int ClearLastLine); 456 extern void diesave(); 457 extern void doend(int rowinc, int colinc); 458 extern void doformat(int c1, int c2, int w, int p, int r); 459 extern void dupcol(); 460 extern void duprow(); 461 extern void doquery(char *s, char *data, int fd); 462 extern void dostat(int fd); 463 extern void dotick(int tick); 464 extern void editexp(int row, int col); 465 extern void editfmt(int row, int col); 466 extern void edit_mode(); 467 extern void edits(int row, int col); 468 extern void editv(int row, int col); 469 extern void efree(struct enode *e); 470 extern void erase_area(int sr, int sc, int er, int ec, int ignorelock); 471 extern void erasedb(); 472 extern void eraser(struct ent *v1, struct ent *v2); 473 extern void fgetnum(int r0, int c0, int rn, int cn, int fd); 474 extern void fill(struct ent *v1, struct ent *v2, double start, double inc); 475 extern void fix_colors(int row1, int col1, int row2, int col2, 476 int delta1, int delta2); 477 extern void fix_frames(int row1, int col1, int row2, int col2, 478 int delta1, int delta2); 479 extern void fix_ranges(int row1, int col1, int row2, int col2, 480 int delta1, int delta2); 481 extern void flush_saved(); 482 extern void formatcol(int arg); 483 extern void format_cell(struct ent *v1, struct ent *v2, char *s); 484 extern void forwcol(int arg); 485 extern void forwrow(int arg); 486 extern void free_ent(register struct ent *p, int unlock); 487 extern void getexp(int r0, int c0, int rn, int cn, int fd); 488 extern void getfmt(int r0, int c0, int rn, int cn, int fd); 489 extern void getformat(int col, int fd); 490 extern void getnum(int r0, int c0, int rn, int cn, int fd); 491 extern void getstring(int r0, int c0, int rn, int cn, int fd); 492 extern void go_last(); 493 extern void goraw(); 494 extern void help(); 495 extern void hide_col(int arg); 496 extern void hide_row(int arg); 497 extern void hidecol(int arg); 498 extern void hiderow(int arg); 499 extern void initcolor(int colornum); 500 extern void initkbd(); 501 extern void ins_in_line(int c); 502 extern void ins_string(char *s); 503 extern void insert_mode(); 504 extern void insertcol(int arg, int delta); 505 extern void insertrow(int arg, int delta); 506 extern void kbd_again(); 507 extern void label(register struct ent *v, register char *s, int flushdir); 508 extern void let(struct ent *v, struct enode *e); 509 extern void list_colors(FILE *f); 510 extern void list_ranges(FILE *f); 511 extern void lock_cells(struct ent *v1, struct ent *v2); 512 extern void markcell(); 513 extern void move_area(int dr, int dc, int sr, int sc, int er, int ec); 514 extern void mover(struct ent *d, struct ent *v1, struct ent *v2); 515 extern void moveto(int row, int col, int lastrow, int lastcol, 516 int cornrow, int corncol); 517 extern void toggle_navigate_mode(); 518 extern void num_search(double n, int firstrow, int firstcol, int lastrow, 519 int lastcol, int errsearch); 520 extern void printfile(char *fname, int r0, int c0, int rn, int cn); 521 extern void pullcells(int to_insert); 522 extern void query(char *s, char *data); 523 extern void read_hist(); 524 extern void remember(int save); 525 extern void resetkbd(); 526 extern void rowshow_op(); 527 extern void scxfree(char *p); 528 extern void setauto(int i); 529 extern void setiterations(int i); 530 extern void setorder(int i); 531 extern void showcol(int c1, int c2); 532 extern void showdr(); 533 extern void showrow(int r1, int r2); 534 extern void showstring(char *string, int dirflush, int hasvalue, int row, 535 int col, int *nextcolp, int mxcol, int *fieldlenp, int r, int c, 536 struct frange *fr, int frightcols, int flcols, int frcols); 537 extern void signals(); 538 extern void slet(struct ent *v, struct enode *se, int flushdir); 539 extern void sortrange(struct ent *left, struct ent *right, char *criteria); 540 extern void startshow(); 541 extern void startdisp(); 542 extern void stopdisp(); 543 extern void str_search(char *s, int firstrow, int firstcol, int lastrow, 544 int lastcol, int num); 545 extern void sync_cranges(); 546 extern void sync_franges(); 547 extern void sync_ranges(); 548 extern void sync_refs(); 549 extern void tblprintfile(char *fname, int r0, int c0, int rn, int cn); 550 extern void unlock_cells(struct ent *v1, struct ent *v2); 551 extern void update(int anychanged); 552 extern void valueize_area(int sr, int sc, int er, int ec); 553 extern void write_cells(register FILE *f, int r0, int c0, int rn, int cn, 554 int dr, int dc); 555 extern void write_colors(FILE *f, int indent); 556 extern void write_cranges(FILE *f); 557 extern void write_fd(register FILE *f, int r0, int c0, int rn, int cn); 558 extern void write_franges(FILE *f); 559 extern void write_hist(); 560 extern void write_line(int c); 561 extern void write_ranges(FILE *f); 562 extern void yank_area(int sr, int sc, int er, int ec); 563 extern void yyerror(char *err); 564 extern int yylex(); 565 extern int yyparse(); 566 #ifdef DOBACKUPS 567 extern int backup_file(char *path); 568 #endif 569 570 extern int modflg; 571 #if !defined(VMS) && !defined(MSDOS) && defined(CRYPT_PATH) 572 extern int Crypt; 573 #endif 574 extern char *mdir; 575 extern char *autorun; 576 extern int skipautorun; 577 extern char *fkey[FKEYS]; 578 extern char *scext; 579 extern char *ascext; 580 extern char *tbl0ext; 581 extern char *tblext; 582 extern char *latexext; 583 extern char *slatexext; 584 extern char *texext; 585 extern int scrc; 586 extern double prescale; 587 extern int extfunc; 588 extern int propagation; 589 extern int repct; 590 extern int calc_order; 591 extern int autocalc; 592 extern int autolabel; 593 extern int autoinsert; 594 extern int autowrap; 595 extern int optimize; 596 extern int numeric; 597 extern int showcell; 598 extern int showtop; 599 extern int color; 600 extern int colorneg; 601 extern int colorerr; 602 extern int braille; 603 extern int braillealt; 604 extern int loading; 605 extern int getrcqual; 606 extern int tbl_style; 607 extern int rndtoeven; 608 extern char *progname; 609 extern int numeric_field; 610 extern int craction; 611 extern int pagesize; /* If nonzero, use instead of 1/2 screen height */ 612 extern int rowlimit; 613 extern int collimit; 614 615 #if BSD42 || SYSIII 616 617 #ifndef cbreak 618 #define cbreak crmode 619 #define nocbreak nocrmode 620 #endif 621 622 #endif 623 624 #if defined(BSD42) || defined(BSD43) && !defined(ultrix) 625 #define memcpy(dest, source, len) bcopy(source, dest, (unsigned int)len); 626 #define memset(dest, zero, len) bzero((dest), (unsigned int)(len)); 627 #else 628 #include <memory.h> 629 #endif 630