Subversion Repositories SvarDOS

Compare Revisions

Ignore whitespace Rev 409 → Rev 410

/svarcom/trunk/cmd/chcp.c
3,7 → 3,7
*/
 
static int cmd_chcp(struct cmd_funcparam *p) {
short nnn = 0;
unsigned short nnn = 0;
unsigned short errcode = 0;
 
if (cmd_ishlp(p)) {
25,8 → 25,7
 
/* one param? must be numeric in range 1+ */
if (p->argc == 1) {
nnn = atoi(p->argv[0]);
if (nnn < 1) {
if (atouns(&nnn, p->argv[0]) != 0) {
outputnl("Invalid code page number");
return(-1);
}
/svarcom/trunk/command.c
57,7 → 57,7
struct config {
int locate;
int install;
int envsiz;
unsigned short envsiz;
} cfg;
 
 
70,8 → 70,9
cfg->locate = 1;
}
if (strstartswith(argv[i], "/e:") == 0) {
cfg->envsiz = atoi(argv[i]+3);
if (cfg->envsiz < 64) cfg->envsiz = 0;
if ((atouns(&(cfg->envsiz), argv[i] + 3) != 0) || (cfg->envsiz < 64)) {
cfg->envsiz = 0;
}
}
}
}
/svarcom/trunk/helpers.c
301,3 → 301,44
dst[end] = 0;
}
}
 
 
/* converts an ASCIIZ string into an unsigned short. returns 0 on success. */
int atouns(unsigned short *r, const char *s) {
int err = 0;
 
_asm {
mov si, s
xor ax, ax /* general purpose register */
xor cx, cx /* contains the result */
mov bx, 10 /* used as a multiplicative step */
 
NEXTBYTE:
xchg cx, ax /* move result into cx temporarily */
lodsb /* AL = DS:[SI++] */
/* is AL 0? if so we're done */
test al, al
jz DONE
/* validate that AL is in range '0'-'9' */
sub al, '0'
jc FAIL /* neg result */
cmp al, 9
jg FAIL
/* restore result into AX (CX contains the new digit) */
xchg cx, ax
/* multiply result by 10 and add cl */
mul bx /* DX AX = AX * BX(10) */
jc FAIL /* overflow */
add ax, cx
/* if CF then overflow occured (overflow part lands in DX) */
jnc NEXTBYTE
 
FAIL:
inc [err]
 
DONE: /* save result (CX) into indirect memory address r */
mov bx, [r]
mov [bx], cx
}
return(err);
}
/svarcom/trunk/helpers.h
78,4 → 78,7
/* converts a FCB filename (FILENAMEEXT) into normal format (FILENAME.EXT) */
void file_fcb2fname(char *dst, const char *src);
 
/* converts an ASCIIZ string into an unsigned short. returns 0 on success. */
int atouns(unsigned short *r, const char *s);
 
#endif