static int doOneCmd( IoContext *pCtx, u8 *aData, int pgsz, char *zCmd, char **pzOut ){ char c; char *z = zCmd; while( safe_isspace(*z) ) z++; c = *z; if( c==0 ){ if( pzOut ) *pzOut = z; return 0; } if( c=='s' || c=='S' ){ if( pzOut ) *pzOut = &z[1]; return fdatasync(pCtx->fd); } if( safe_isdigit(c) ){ i64 iOff = 0; int nByte = 0; int rc = 0; int nPg; int iPg; nByte = getNextSize(z, &z, &rc); if( rc || *z!='@' ) goto bad_command; z++; iOff = getNextSize(z, &z, &rc); if( rc || (safe_isspace(*z)==0 && *z!='\0') ) goto bad_command; if( pzOut ) *pzOut = z; nPg = (nByte+pgsz-1) / pgsz; lseek(pCtx->fd, iOff, SEEK_SET); for(iPg=0; iPg<nPg; iPg++){ write(pCtx->fd, aData, pgsz); } pCtx->nWrite += nByte/1024; return 0; } bad_command: testPrintError("unrecognized command: %s", zCmd); return 1; }
static i64 getNextSize(char *zIn, char **pzOut, int *pRc){ i64 iRet = 0; if( *pRc==0 ){ char *z = zIn; if( !safe_isdigit(*z) ){ *pRc = 1; return 0; } /* Process digits */ while( safe_isdigit(*z) ){ iRet = iRet*10 + (*z - '0'); z++; } /* Process suffix */ switch( *z ){ case 'k': case 'K': iRet = iRet * 1024; z++; break; case 'm': case 'M': iRet = iRet * 1024 * 1024; z++; break; case 'g': case 'G': iRet = iRet * 1024 * 1024 * 1024; z++; break; } if( pzOut ) *pzOut = z; } return iRet; }
int getToken(LexStream *L, AST **ast_ptr) { // int base = 10; int c; AST *ast = NULL; int at_startofline = (L->eoln == 1); int peekc; c = skipSpace(L, &ast); if (c >= 127) { *ast_ptr = last_ast = ast; return c; } else if (safe_isdigit(c)) { lexungetc(L,c); ast = NewAST(AST_INTEGER, NULL, NULL); c = parseNumber(L, 10, &ast->d.ival); if (c == T_FLOATNUM) ast->kind = AST_FLOAT; } else if (c == '$') { ast = NewAST(AST_INTEGER, NULL, NULL); c = parseNumber(L, 16, &ast->d.ival); } else if (c == '%') { ast = NewAST(AST_INTEGER, NULL, NULL); c = lexgetc(L); if (c == '%') { c = parseNumber(L, 4, &ast->d.ival); } else { lexungetc(L, c); c = parseNumber(L, 2, &ast->d.ival); } } else if (isIdentifierStart(c)) { lexungetc(L, c); c = parseIdentifier(L, &ast, NULL); /* if in pasm, and at start of line, restart temporary labels */ if (c == T_IDENTIFIER && InDatBlock(L) && at_startofline) { L->lastGlobal = ast->d.string; } } else if (c == ':') { peekc = lexgetc(L); if (peekc == '=') { c = T_ASSIGN; } else if (!gl_p2 && isIdentifierStart(peekc) && InDatBlock(L)) { lexungetc(L, peekc); c = parseIdentifier(L, &ast, L->lastGlobal ? L->lastGlobal : ""); } else { lexungetc(L, peekc); } } else if (gl_p2 && c == '.' && isIdentifierStart(lexpeekc(L)) && InDatBlock(L)) { c = parseIdentifier(L, &ast, L->lastGlobal ? L->lastGlobal : ""); } else if (strchr(operator_chars, c) != NULL) { char op[6]; int i; int token; Symbol *sym = NULL; op[0] = token = c; for (i = 1; i < sizeof(op)-1; i++) { c = lexgetc(L); if (c >= 128 || strchr(operator_chars, c) == NULL) { lexungetc(L, c); break; } op[i] = c; op[i+1] = 0; sym = FindSymbol(&reservedWords, op); if (sym) { token = INTVAL(sym); } else { lexungetc(L, c); break; } } c = token; } else if (c == '"') { c = parseString(L, &ast); } *ast_ptr = last_ast = ast; return c; }
int isIdentifierChar(int c) { return isIdentifierStart(c) || safe_isdigit(c); }