elks-enhanced
public
Read
Owner: themaster
Branch: master
Commits: 6893
Updated: 2026-04-19 00:15
Git CLI clone URL
git clone https://www.xt-emporium.com/git/elks-enhanced.git
Fullscreen desktop URL
Code
Commits
History
Branches
Bug Reports
Discussions
Compare
Settings
elks-enhanced
/
elkscmd
/
unused
/
levee
/
doscall.c
File editor
/* * LEVEE, or Captain Video; A vi clone * * Copyright (c) 1982-1997 David L Parsons * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by David L Parsons (orc@pell.chi.il.us). My name may not be used * to endorse or promote products derived from this software without * specific prior written permission. THIS SOFTWARE IS PROVIDED * AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, * WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND * FITNESS FOR A PARTICULAR PURPOSE. */ /* * dos interface for levee (Microsoft C) */ #include "levee.h" #if MSDOS #include <glob.h> #include <dos.h> int PROC min(a,b) int a,b; { return (a>b) ? b : a; } int PROC max(a,b) int a,b; { return (a<b) ? b : a; } PROC strput(s) char *s; { write(1, s, strlen(s)); } /* get a key, mapping certain control sequences */ PROC getKey() { register c; extern char _far crawcin(); c = crawcin(); if (c == 0 || c == 0xe0) switch (c=crawcin()) { case 'K': return LTARROW; case 'M': return RTARROW; case 'H': return UPARROW; case 'P': return DNARROW; case 'I': return 'U'-'@'; /* page-up */ case 'Q': return 'D'-'@'; /* page-down */ default : return 0; } return c; } /* don't allow interruptions to happen */ PROC nointr() { extern void _cdecl _interrupt _far ignore_ctrlc(); _dos_setvect(0x23, ignore_ctrlc); } /* nointr */ /* have ^C do what it usually does */ PROC allowintr() { extern void _cdecl _interrupt _far intr_on_ctrlc(); _dos_setvect(0x23, intr_on_ctrlc); } /* allowintr */ /* * basename() returns the filename part of a pathname */ char * basename(s) register char *s; { register char *p = s; for (p = s+strlen(s); p > s; --p) if (p[-1] == '/' || p[-1] == '\\' || p[-1] == ':') return p; return s; } /* basename */ /* * glob() expands a wildcard, via calls to _dos_findfirst/_next() * and pathname retention. */ char * glob(path, dta) char *path; struct glob_t *dta; { static char path_bfr[256]; /* full pathname to return */ static char *file_part; /* points at file - for filling */ static char isdotpattern; /* looking for files starting with . */ static char isdotordotdot; /* special case . or .. */ static struct glob_t *dta_bfr; /* pointer to desired dta */ static struct find_t dird; /* DOS dta */ register st; /* status from _dos_findxxx */ if (path) { /* when we start searching, save the path part of the filename in * a safe place. */ strcpy(path_bfr, path); file_part = basename(path_bfr); /* set up initial parameters for DosFindFirst() */ dta_bfr = dta; if (isdotpattern = (*file_part == '.')) /* _dos_findfirst() magically expands . and .. into their * directory names. Admittedly, there are cases where * this can be useful, but this is not one of them. So, * if we find that we're matching . and .., we just * special-case ourselves into oblivion to get around * this particular bit of DOS silliness. */ isdotordotdot = (file_part[1] == 0 || file_part[1] == '.'); else isdotordotdot = 0; st = _dos_findfirst(path, 0x16, &dird); } else st = _dos_findnext(&dird); while (st == 0) { /* Unless the pattern has a leading ., don't include any file * that starts with . */ if (dird.name[0] == '.' && !isdotpattern) st = _dos_findnext(&dird); else { /* found a file - affix the path leading to it, then return * a pointer to the (static) buffer holding the path+the name. */ strlwr(dird.name); /* DOS & OS/2 are case-insensitive */ if (dta_bfr) { dta_bfr->wr_time = dird.wr_time; dta_bfr->wr_date = dird.wr_date; if (isdotordotdot) strcpy(dta_bfr->name, file_part); else { strncpy(dta_bfr->name, dird.name, sizeof(dta_bfr->name)-1); dta_bfr->name[sizeof(dta_bfr->name)-1] = 0; } dta_bfr->size = dird.size; dta_bfr->attrib = dird.attrib; } if (!isdotordotdot) strcpy(file_part, dird.name); return path_bfr; } } /* nothing matched */ if (path && isdotordotdot) { /* must be at root, so statting dot will most likely fail. Fake a * dta. */ if (dta_bfr) { memset(dta_bfr, 0, sizeof *dta_bfr); dta_bfr->attrib = 0x10; dta_bfr->name[0] = '.'; } return path_bfr; } return (char*)0; } /* glob */ #endif /*MSDOS*/
Commit message
This repository is read-only for this account.
Repository snapshot
Current branch
master
Visibility
public
Your access
Read
Remote
Configured
File activity
View file history