comparison input/input.c @ 36137:5302a565ada7

Simplify and clean up code.
author reimar
date Sat, 04 May 2013 21:41:37 +0000
parents b4199449fc69
children c3b4a1b48c7d
comparison
equal deleted inserted replaced
36136:b4199449fc69 36137:5302a565ada7
1579 1579
1580 free(binds); 1580 free(binds);
1581 1581
1582 } 1582 }
1583 1583
1584 static void strmove(char *dst, const char *src) {
1585 memmove(dst, src, strlen(src) + 1);
1586 }
1587
1584 static int 1588 static int
1585 mp_input_parse_config(char *file) { 1589 mp_input_parse_config(char *file) {
1586 int fd; 1590 int fd;
1587 int bs = 0,r,eof = 0,comments = 0; 1591 int eof = 0,comments = 0;
1588 char *iter,*end; 1592 char *iter,*end;
1589 char buffer[BS_MAX]; 1593 char buffer[BS_MAX];
1590 int n_binds = 0, keys[MP_MAX_KEY_DOWN+1] = { 0 }; 1594 int n_binds = 0, keys[MP_MAX_KEY_DOWN+1] = { 0 };
1591 1595
1592 fd = open(file,O_RDONLY); 1596 fd = open(file,O_RDONLY);
1597 return 0; 1601 return 0;
1598 } 1602 }
1599 1603
1600 mp_msg(MSGT_INPUT,MSGL_V,"Parsing input config file %s\n",file); 1604 mp_msg(MSGT_INPUT,MSGL_V,"Parsing input config file %s\n",file);
1601 1605
1606 buffer[0] = 0;
1602 while(1) { 1607 while(1) {
1608 int bs = strlen(buffer);
1603 if(! eof && bs < BS_MAX-1) { 1609 if(! eof && bs < BS_MAX-1) {
1604 if(bs > 0) bs--; 1610 int r = read(fd,buffer+bs,BS_MAX-1-bs);
1605 r = read(fd,buffer+bs,BS_MAX-1-bs);
1606 if(r < 0) { 1611 if(r < 0) {
1607 if(errno == EINTR) 1612 if(errno == EINTR)
1608 continue; 1613 continue;
1609 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrReadingInputConfig,file,strerror(errno)); 1614 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrReadingInputConfig,file,strerror(errno));
1610 close(fd); 1615 close(fd);
1611 return 0; 1616 return 0;
1612 } else if(r == 0) {
1613 eof = 1;
1614 } else {
1615 bs += r+1;
1616 buffer[bs-1] = 0;
1617 } 1617 }
1618 eof = r == 0;
1619 bs += r;
1620 buffer[bs] = 0;
1618 } 1621 }
1619 // Empty buffer : return 1622 // Empty buffer : return
1620 if(bs <= 1) { 1623 if(!buffer[0]) {
1621 mp_msg(MSGT_INPUT,MSGL_V,"Input config file %s parsed: %d binds\n",file,n_binds); 1624 mp_msg(MSGT_INPUT,MSGL_V,"Input config file %s parsed: %d binds\n",file,n_binds);
1622 close(fd); 1625 close(fd);
1623 return 1; 1626 return 1;
1624 } 1627 }
1625 1628
1626 iter = buffer; 1629 iter = buffer;
1627 1630
1628 if(comments) { 1631 if(comments) {
1632 // search for newline ending comment
1629 for( ; iter[0] && iter[0] != '\n' ; iter++) 1633 for( ; iter[0] && iter[0] != '\n' ; iter++)
1630 /* NOTHING */; 1634 /* NOTHING */;
1631 if(!iter[0]) { // Buffer was full of comment 1635 if(!iter[0]) { // Buffer was full of comment
1632 bs = 0; 1636 buffer[0] = 0;
1633 continue; 1637 continue;
1634 } 1638 }
1635 iter++;
1636 r = strlen(iter);
1637 memmove(buffer,iter,r+1);
1638 bs = r+1;
1639 comments = 0; 1639 comments = 0;
1640 strmove(buffer, iter+1);
1640 continue; 1641 continue;
1641 } 1642 }
1642 1643
1643 // Find the wanted key 1644 // Find the wanted key
1644 if(keys[0] == 0) { 1645 if(keys[0] == 0) {
1645 // Jump beginning space 1646 // Jump beginning space
1646 for( ; iter[0] && strchr(SPACE_CHAR,iter[0]) != NULL ; iter++) 1647 for( ; iter[0] && strchr(SPACE_CHAR,iter[0]) != NULL ; iter++)
1647 /* NOTHING */; 1648 /* NOTHING */;
1648 if(!iter[0]) { // Buffer was full of space char 1649 if(!iter[0]) { // Buffer was full of space char
1649 bs = 0; 1650 buffer[0] = 0;
1650 continue; 1651 continue;
1651 } 1652 }
1652 if(iter[0] == '#') { // Comments 1653 if(iter[0] == '#') { // Comments
1653 comments = 1; 1654 comments = 1;
1654 continue; 1655 continue;
1656 // Find the end of the key code name 1657 // Find the end of the key code name
1657 for(end = iter; end[0] && strchr(SPACE_CHAR,end[0]) == NULL ; end++) 1658 for(end = iter; end[0] && strchr(SPACE_CHAR,end[0]) == NULL ; end++)
1658 /*NOTHING */; 1659 /*NOTHING */;
1659 if(!end[0]) { // Key name doesn't fit in the buffer 1660 if(!end[0]) { // Key name doesn't fit in the buffer
1660 if(buffer == iter) { 1661 if(buffer == iter) {
1661 if(eof && (buffer-iter) == bs) 1662 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrBuffer2SmallForKeyName,iter);
1662 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrUnfinishedBinding,iter);
1663 else
1664 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrBuffer2SmallForKeyName,iter);
1665 return 0; 1663 return 0;
1666 } 1664 }
1667 memmove(buffer,iter,end-iter); 1665 strmove(buffer,iter);
1668 bs = end-iter;
1669 continue; 1666 continue;
1670 } 1667 }
1671 { 1668 end[0] = 0;
1672 char name[end-iter+1]; 1669 if(! mp_input_get_input_from_name(iter,keys)) {
1673 strncpy(name,iter,end-iter); 1670 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrUnknownKey,iter);
1674 name[end-iter] = 0;
1675 if(! mp_input_get_input_from_name(name,keys)) {
1676 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrUnknownKey,name);
1677 close(fd); 1671 close(fd);
1678 return 0; 1672 return 0;
1679 } 1673 }
1680 } 1674 strmove(buffer,end+1);
1681 if( bs > (end-buffer))
1682 memmove(buffer,end,bs - (end-buffer));
1683 bs -= end-buffer;
1684 continue; 1675 continue;
1685 } else { // Get the command 1676 } else { // Get the command
1686 while(iter[0] == ' ' || iter[0] == '\t') iter++; 1677 while(iter[0] == ' ' || iter[0] == '\t') iter++;
1687 // Found new line 1678 // Found new line
1688 if(iter[0] == '\n' || iter[0] == '\r') { 1679 if(iter[0] == '\n' || iter[0] == '\r') {
1690 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrNoCmdForKey,mp_input_get_key_name(keys[0])); 1681 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrNoCmdForKey,mp_input_get_key_name(keys[0]));
1691 for(i = 1; keys[i] != 0 ; i++) 1682 for(i = 1; keys[i] != 0 ; i++)
1692 mp_msg(MSGT_INPUT,MSGL_ERR,"-%s",mp_input_get_key_name(keys[i])); 1683 mp_msg(MSGT_INPUT,MSGL_ERR,"-%s",mp_input_get_key_name(keys[i]));
1693 mp_msg(MSGT_INPUT,MSGL_ERR,"\n"); 1684 mp_msg(MSGT_INPUT,MSGL_ERR,"\n");
1694 keys[0] = 0; 1685 keys[0] = 0;
1695 if(iter > buffer) { 1686 strmove(buffer,iter+1);
1696 memmove(buffer,iter,bs- (iter-buffer));
1697 bs -= (iter-buffer);
1698 }
1699 continue; 1687 continue;
1700 } 1688 }
1701 for(end = iter ; end[0] != '\n' && end[0] != '\r' && end[0] ; end++) 1689 for(end = iter ; end[0] != '\n' && end[0] != '\r' && end[0] ; end++)
1702 /* NOTHING */; 1690 /* NOTHING */;
1703 if(!end[0] && ! (eof && ((end+1) - buffer) == bs)) { 1691 if(!end[0]) {
1704 if(iter == buffer) { 1692 if(iter == buffer) {
1705 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrBuffer2SmallForCmd,buffer); 1693 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrBuffer2SmallForCmd,buffer);
1706 close(fd); 1694 close(fd);
1707 return 0; 1695 return 0;
1708 } 1696 }
1709 memmove(buffer,iter,end - iter); 1697 strmove(buffer,iter);
1710 bs = end - iter;
1711 continue; 1698 continue;
1712 } 1699 }
1713 { 1700 end[0] = 0;
1714 char cmd[end-iter+1]; 1701 mp_input_bind_keys(keys,iter);
1715 strncpy(cmd,iter,end-iter);
1716 cmd[end-iter] = 0;
1717 //printf("Set bind %d => %s\n",keys[0],cmd);
1718 mp_input_bind_keys(keys,cmd);
1719 n_binds++; 1702 n_binds++;
1720 }
1721 keys[0] = 0; 1703 keys[0] = 0;
1722 end++; 1704 strmove(buffer,end+1);
1723 if(bs > (end-buffer))
1724 memmove(buffer,end,bs-(end-buffer));
1725 bs -= (end-buffer);
1726 continue; 1705 continue;
1727 } 1706 }
1728 } 1707 }
1729 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrWhyHere); 1708 mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrWhyHere);
1730 close(fd); 1709 close(fd);