mirror of https://github.com/zrafa/xinu-avr.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.3 KiB
63 lines
1.3 KiB
/* rfsgetmode.c - rfsgetmode */ |
|
|
|
#include <xinu.h> |
|
|
|
/*------------------------------------------------------------------------ |
|
* rfsgetmode - Parse mode argument and generate integer of mode bits |
|
*------------------------------------------------------------------------ |
|
*/ |
|
|
|
int32 rfsgetmode ( |
|
char *mode /* String of mode characters */ |
|
) |
|
{ |
|
int32 mbits; /* Mode bits to return (in host */ |
|
/* byte order) */ |
|
char ch; /* Next character in mode string*/ |
|
|
|
mbits = 0; |
|
|
|
/* Mode string specifies: */ |
|
/* r - read */ |
|
/* w - write */ |
|
/* o - old (file must exist) */ |
|
/* n - new (create a new file) */ |
|
|
|
while ( (ch = *mode++) != NULLCH) { |
|
switch (ch) { |
|
|
|
case 'r': if (mbits&RF_MODE_R) { |
|
return SYSERR; |
|
} |
|
mbits |= RF_MODE_R; |
|
continue; |
|
|
|
case 'w': if (mbits&RF_MODE_W) { |
|
return SYSERR; |
|
} |
|
mbits |= RF_MODE_W; |
|
continue; |
|
|
|
case 'o': if (mbits&RF_MODE_O || mbits&RF_MODE_N) { |
|
return SYSERR; |
|
} |
|
mbits |= RF_MODE_O; |
|
break; |
|
|
|
case 'n': if (mbits&RF_MODE_O || mbits&RF_MODE_N) { |
|
return SYSERR; |
|
} |
|
mbits |= RF_MODE_N; |
|
break; |
|
|
|
default: return SYSERR; |
|
} |
|
} |
|
|
|
/* If neither read nor write specified, allow both */ |
|
|
|
if ( (mbits&RF_MODE_RW) == 0 ) { |
|
mbits |= RF_MODE_RW; |
|
} |
|
return mbits; |
|
}
|
|
|