/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 |